【问题标题】:replace words in text ignore urls替换文本中的单词忽略网址
【发布时间】:2011-03-07 05:33:24
【问题描述】:

我使用这一行来搜索带有 url 的文本中的名称。

$name = "xxx";
$text = "my name is xxx en my website is http://xxx.something.com";
$text = preg_replace("/\b(".preg_quote($name, "/").")\b/i", $url, $text);

如何更改此正则表达式以忽略文本中的网址

【问题讨论】:

    标签: php regex replace preg-replace


    【解决方案1】:

    1) 您可以使用正则表达式查找所有网址(例如,http://snipplr.com/view/2371/regex-regular-expression-to-match-a-url/) - 记住它们的位置和长度

    2) 使用您的正则表达式查找单词的所有出现并记住位置和长度

    3) 查看 2) 的结果并检查该单词是否不在 url 中。

    【讨论】:

      【解决方案2】:

      不完全是您正在寻找的东西,但可能对您有帮助:

      当且仅当xxx 被空格包围或位于字符串的开头或结尾时,将xxx 替换为yyy

      <?
      $name = "xxx";
      $text = "xxx my name is xxx en my website xxx is http://xxx.something.com xxx";
      $text = preg_replace("%(?<=^| )".$name."(?= |$)%i", "yyy", $text);
      echo $text."\n";
      //yyy my name is yyy en my website yyy is http://xxx.something.com yyy
      ?>
      

      如果 PHP 支持可变长度查找断言会更容易;因为那样我们可以使用更准确的(?&lt;!http://[^ ]+)\bxxx\b

      【讨论】:

      • 我对您建议的更准确的解决方案非常感兴趣。我认为 PHP 现在支持一切必要的东西。我试过/(?&lt;!http:\/\/[^ ])+\bxxx\b/i,但它只匹配整个单词,用空格分隔,而不是yxxxyxxxy。任何提示将不胜感激。而且 https 支持也很方便。无法理解这里的逻辑。
      猜你喜欢
      • 2011-03-06
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多