【问题标题】:preg_replace words not inside a urlpreg_replace 不在 url 中的单词
【发布时间】:2012-08-27 09:05:50
【问题描述】:

我正在使用 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 之前的单词。 任何帮助将不胜感激。

【问题讨论】:

    标签: regex url preg-replace assertion


    【解决方案1】:

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

    我希望这会有所帮助。

    祝你好运。

    【讨论】:

    • 我不确定如何实现这一点。只有当第二个选项匹配时,如何才能进行替换?例如 foo foo.com 应该产生 bar foo.com 但您的解决方案将产生 bar foo.com bar
    • 最后我能够使用您的方法解决问题,但我只能使用 preg_replace_callback 函数消耗字符串的丢弃部分,并在回调中决定我是否正在处理或没有匹配的字符串。
    • 很高兴你让它工作。我完全错过了你的评论,对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多