0

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

这些例子应该被忽略:

foo.com

foo.com/foo

foo.com/foo/foo

对于一个基本示例(用 php 编写),我尝试使用否定前瞻断言忽略包含.com和可选斜杠和字符的字符串,但没有成功:

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

此调用仅忽略.com之前的单词。任何帮助将非常感激。

4

1 回答 1

0

在这种情况下,更容易将问题倒过来考虑。您想匹配不在url 中的单词。相反,您想匹配 url单词。因此,您的表达式将如下所示:url_match_here|(?:my|words|here). 这将允许正则表达式引擎首先使用 URL,然后尝试匹配这些单词。因此,您永远不必担心匹配 URL 中的单词。如果要保持文本结构,可以使用preg_replace, 和以下表达式(url_match_here)|(?:my|words|here)并替换为\1来保留 URL 和文本。

我希望这有帮助。

祝你好运。

于 2012-08-27T09:11:33.967 回答