如何在模式中使用 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)