2012-08-27 31 views
0

我使用preg_replace来替换可能包含一些URL的文本中的单词列表。 问题是我不想将这些单词替换为url的一部分。preg_replace单词不在url内

这些实施例应该被忽略:

foo.com

foo.com/foo

foo.com/foo/foo

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

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

此调用工作之前.COM只是忽略了字。 任何帮助将非常感激。

回答

0

在像这样的情况下,它更容易想到倒转的问题。你想在网址中匹配而不是。反而认为,你想匹配的网址是这个词。所以,你的表情看起来像这样:url_match_here|(?:my|words|here)。这将允许regex引擎首先使用URL,然后尝试匹配这些单词。因此,您无需担心在URL中匹配单词。如果要维护文本结构,可以使用preg_replace,并使用以下表达式(url_match_here)|(?:my|words|here)并替换为\1以保留URL和文本。

我希望这会有所帮助。

祝你好运。

+0

我不确定如何实现这一点。 只有当第二个选项匹配时,如何才能进行更换? 例如** foo foo.com **应该生成** bar foo.com ** 但您的解决方案会生成** bar foo.com bar ** – savioret

+0

最后,我能够使用您的方法解决问题,但我只能使用preg_replace_callback函数来使用字符串的丢弃部分,并且在回调函数内部决定是处理还是不处理匹配的字符串。 – savioret

+0

很高兴你得到它的工作。我完全错过了你的评论,对不起。 –