我在字符串中使用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:.*?)>.*?<\/$1>/
这是一个非工作解决方案,仅用于表示实现的想法。
非常欢迎您的所有帮助,想法......提前感谢您的回答。
答案 0 :(得分:0)
要直接回答这个问题,这是一个简化的工作示例:
(?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(https://www.youtube.com/watch?v=ayo8zDnd-m8)上提供令人惊叹的蜘蛛侠 Jordi Boggiano的精彩演讲