我正在使用这个正则表达式
(preg_replace( "/\bany word\b/", `"<a href="abc@domain.com">any word</a>"` ,
$content))
在我的代码中,这是用给定的锚标记替换给定的关键字,但如果$content
中已经有链接,则它不会更改关键字或新链接的链接!为此我用了
(preg_match( "/\A<a\s.+>.*\banyword\b.*<\s*\/a\s*>\z/", $content))
但如果在$content
内有许多名称相同的关键字,有些是链接,有些则不是链接,那么我如何用链接替换这些关键字。
答案 0 :(得分:0)
你需要消极的向前看并向后看以解决这个问题。请查看PHP手册中的Assertions章节。
你正在使用已经消极的向前看,并通过使用单词边界运算符\b
来看后面。单词边界是非单词字符,后跟单词字符或单词字符,后跟非单词字符。不捕获所有字符。
(?:\w)(?=\W)|(?:\W)(?=\w)
但是你不需要单词边界。您需要匹配一个字符串,该字符串不是锚点的一部分。不属于锚意味着,不能有关闭锚标记或字符串的后半部分,后跟锚文本和结束锚标记。它由这个正则表达式表示:
<?
$content = 'Send it to abc. <a href="abc@old.com">abc</a> needs it.';
$content = preg_replace ('/(abc)(?!([^\"]*\">[^<]*)?<\/a>)/',
'<a href="abc@domain.com">$1</a>',
$content);
echo $content, "\n";
?>
此脚本将生成以下输出:
$ php look-around.php
Send it to <a href="abc@domain.com">abc</a>. <a href="abc@old.com">abc</a> needs it.
它只会替换第一个abc
。对于你的锚,你必须反过来做。