正则表达式搜索向前看

时间:2016-07-21 19:26:38

标签: regex

使用PCRE

文本:

<xsi:placeOrderResult list="test:value">1469120938131</placeOrderResult></soapenv:Body>

想要匹配(但不包括)“&lt;”之后的任何字母数字字符字符,UP和包括“:”字符,但必须在FIRST“&gt;”之前找到冒号找到了。

上述预期结果将是:

<placeOrderResult list="test:value">1469120938131</placeOrderResult></soapenv:Body>

第一部分是相当直接的 - 我无法弄清楚的是“必须在第一个&gt;之前找到冒号”。

1 个答案:

答案 0 :(得分:0)

(?<=<)(\w+?:)(?=[^<]*?>)

https://regex101.com/r/yY7yD7

$re = "/(?<=<)(\\w+?:)(?=[^<]*?>)/"; 
$str = "#Text:\n<xsi:placeOrderResult list=\"test:value\">1469120938131</placeOrderResult></soapenv:Body>\n\n#Expected result\n<placeOrderResult list=\"test:value\">1469120938131</placeOrderResult></soapenv:Body>"; 
$subst = ""; 

$result = preg_replace($re, $subst, $str, 1);

正则表达式解释:

  • (?<=<) - 正面Lookbehind - 匹配角色<

  • \w+?在一次和无限次之间匹配任何单词字符[a-zA-Z0-9_],尽可能少,根据需要进行扩展[懒惰]

  • :字面匹配字符:
  • (?=[^<]*?>)正向前瞻 - 在一次和无限次之间匹配每个字符<,尽可能少,根据需要扩展[懒惰]。直到它到达角色>

如果你没有删除任何东西,&#34;&#34;,对于捕获的正则表达式,它会给出你的预期结果:

<placeOrderResult list="test:value">1469120938131</placeOrderResult></soapenv:Body>