preg_replace不在网址内的单词

时间:2012-08-27 09:05:51

标签: regex url preg-replace assertion

我正在使用preg_replace来替换可能包含一些网址的文本中的单词列表。 问题是,如果这些单词是网址的一部分,我不想替换这些单词。

这些例子应该被忽略:

  

foo.com

     

foo.com/foo

     

foo.com/foo/foo

对于一个基本的例子(用php编写),我试图忽略包含 .com 和可选斜杠和字符的字符串,使用负向预测断言,但没有成功:

preg_replace("/(\b)foo(\b)/", "$1bar$2(?!(\w+\.\w+)*(\.com)([\.\/]\w+)*)", $text);

此通话只会忽略 .com 之前的字词。 任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

在这样的情况下,更容易想到倒置的问题。您希望在网址中匹配而不是中的字词。相反,你想要匹配网址。所以,你的表达式如下:url_match_here|(?:my|words|here)。这将允许正则表达式引擎首先使用URL,然后尝试匹配这些单词。因此,您永远不必担心匹配URL中的单词。如果要维护文本结构,可以使用preg_replace,使用以下表达式(url_match_here)|(?:my|words|here)并替换为\1以保留网址和文本。

我希望这会有所帮助。

祝你好运。