如何在模式中的preg_replace中使用变量?

时间:2016-06-08 11:55:22

标签: php preg-replace

我在字符串中使用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>/

这是一个非工作解决方案,仅用于表示实现的想法。

非常欢迎您的所有帮助,想法......提前感谢您的回答。

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的精彩演讲