PHP:正则表达式使用Lookbehind Assertions中的通配符替换单词

时间:2013-07-03 05:18:27

标签: php regex regex-lookarounds

我正在寻找一个可以匹配和替换字符串中的单词的PHP Regex脚本。

正则表达式只需匹配完整的单词,我可以轻松完成:

/\b(SEARCH_TERM)\b/

我遇到的问题是某些字符串包含html元素,例如< a> 标记和< img> 标记,其中 href src 属性有时可能包含其路径中的待替换单词。 如果在这些元素中替换了该单词,则链接或图像将不再起作用。

示例,将“test”替换为“SEARCH_TERM”以获取以下示例字符串:

my test string <a href="http://www.google.com?q=my+test+string">link</a>

会回来:

my SEARCH_TERM string <a href="http://www.google.com?q=my+SEARCH_TERM+string">link</a>

我需要忽略href属性文本并返回:

my SEARCH_TERM string <a href="http://www.google.com?q=my+test+string">link</a>

我看过使用Regex的Lookbehind Assertions(如下所示),但不允许使用可变长度的通配符。

/(?<!(href|src)=.*)\b(SEARCH_TERM)\b/

注意:我特别需要使用Regex,而不是DOM解析器。

1 个答案:

答案 0 :(得分:2)

正如我所提到的,你需要使用html parser

但如果你想要它

/\btest\b(?=[^>]*(<|$))/s

以上正则表达式只有在没有匹配<

的情况下才有end of string>(不是行)才会匹配

注意

如果您的文字本身包含>,则无效。

例如

 hello>world

因此你应该使用解析器的原因