替换文本中的单词,忽略URL

4
我使用这行代码在带有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);

我该如何修改这个正则表达式以忽略文本中的URL?
2个回答

1

1

虽然不完全符合您的要求,但这可能会有所帮助:

仅当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支持变长的后顾断言,那么这将更容易;因为我们可以使用更准确的(?<!http://[^ ]+)\bxxx\b


我对您所建议的更精确的解决方案非常感兴趣。我认为PHP现在支持必要的一切。我已经尝试过 /(?<!http:\/\/[^ ])+\bxxx\b/i 但它只匹配由空格分隔的整个单词,而不是 yxxxy 或者 xxxy。任何提示都将不胜感激。另外,https支持也很方便。我无法理解这里的逻辑。 - medoingthings

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接