用于锚标记的PHP中的正则表达式

时间:2013-11-30 09:17:49

标签: php regex anchor

我正在使用这个正则表达式

(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内有许多名称相同的关键字,有些是链接,有些则不是链接,那么我如何用链接替换这些关键字。

1 个答案:

答案 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。对于你的锚,你必须反过来做。