如何在模式中使用 preg_replace 中的变量?
How to use variables in preg_replace in pattern?
我在这样的字符串中有 XML:
<a:b>
<a:c></a:c>
<a:c></a:c>
</a:b>
我想删除命名空间 'a' 中的所有数据。
当然可以这样做:
/<\ba\b:.*?>.*?<\/\ba\b:.*?>/
但在这种情况下结果是:
<a:c></a:c>
</a:b>
因为命名空间 'a' 的第一个结束标记实际上是一个子元素。所以递归地做它会在我的字符串中存在''。
所以我的想法是在模式中使用变量,就像在替换中使用它一样:
/<(\ba\b:.*?)>.*?<\/>/
这是一个无效的解决方案,仅用于表示实现的想法。
非常欢迎您的所有帮助、想法...。提前感谢您的回答。
为了直接回答问题,这里是一个简化的工作示例:
(?P<nodeOpen><a:(?P<nodeName>.*)>)(?P<data>.*)(?P<nodeClose><\/a:(?P=nodeName)>)
在php代码中使用:
preg_match('#(?P<nodeOpen><a:(?P<nodeName>.*)>)(?P<data>.*)(?P<nodeClose><\/a:(?P=nodeName)>)#s', $xml, $matches);
/* Produce :
array(9) {
[0]=>
string(43) "<a:b>
<a:c></a:c>
<a:c></a:c>
</a:b>"
["nodeOpen"]=>
string(5) "<a:b>"
[1]=>
string(5) "<a:b>"
["nodeName"]=>
string(1) "b"
[2]=>
string(1) "b"
["data"]=>
string(32) "
<a:c></a:c>
<a:c></a:c>
"
[3]=>
string(32) "
<a:c></a:c>
<a:c></a:c>
"
["nodeClose"]=>
string(6) "</a:b>"
[4]=>
string(6) "</a:b>"
}
*/
然后连接:
$emptyNode = $matches['nodeOpen'] . $matches['nodeClose'];
可在线咨询:https://regex101.com/r/xX1uZ9/2
我还向您推荐 youtube 上令人惊叹的 蜘蛛侠 Jordi Boggiano 的精彩演讲 (https://www.youtube.com/watch?v=ayo8zDnd-m8)
我在这样的字符串中有 XML:
<a:b>
<a:c></a:c>
<a:c></a:c>
</a:b>
我想删除命名空间 'a' 中的所有数据。
当然可以这样做:
/<\ba\b:.*?>.*?<\/\ba\b:.*?>/
但在这种情况下结果是:
<a:c></a:c>
</a:b>
因为命名空间 'a' 的第一个结束标记实际上是一个子元素。所以递归地做它会在我的字符串中存在''。
所以我的想法是在模式中使用变量,就像在替换中使用它一样:
/<(\ba\b:.*?)>.*?<\/>/
这是一个无效的解决方案,仅用于表示实现的想法。
非常欢迎您的所有帮助、想法...。提前感谢您的回答。
为了直接回答问题,这里是一个简化的工作示例:
(?P<nodeOpen><a:(?P<nodeName>.*)>)(?P<data>.*)(?P<nodeClose><\/a:(?P=nodeName)>)
在php代码中使用:
preg_match('#(?P<nodeOpen><a:(?P<nodeName>.*)>)(?P<data>.*)(?P<nodeClose><\/a:(?P=nodeName)>)#s', $xml, $matches);
/* Produce :
array(9) {
[0]=>
string(43) "<a:b>
<a:c></a:c>
<a:c></a:c>
</a:b>"
["nodeOpen"]=>
string(5) "<a:b>"
[1]=>
string(5) "<a:b>"
["nodeName"]=>
string(1) "b"
[2]=>
string(1) "b"
["data"]=>
string(32) "
<a:c></a:c>
<a:c></a:c>
"
[3]=>
string(32) "
<a:c></a:c>
<a:c></a:c>
"
["nodeClose"]=>
string(6) "</a:b>"
[4]=>
string(6) "</a:b>"
}
*/
然后连接:
$emptyNode = $matches['nodeOpen'] . $matches['nodeClose'];
可在线咨询:https://regex101.com/r/xX1uZ9/2
我还向您推荐 youtube 上令人惊叹的 蜘蛛侠 Jordi Boggiano 的精彩演讲 (https://www.youtube.com/watch?v=ayo8zDnd-m8)