为什么这个正则表达式不排除这个词?

时间:2011-05-15 16:04:00

标签: php regex

我有这段代码:

$str=preg_replace(
    '#\b[^"](Hello User)#',         
    '<a href="$1">$1</a>',
    $str);
return nl2br($str);

所以,我想替换Hello User的{​​{1}}的所有出现。{/ 1}}。

例如,使用字符串:

"

我会看到这个结果:

Hello User\n
"Hello User\n
Hello User\n
"Hello User"\n

但实际上输出正好相反:

<a href="Hello User">Hello User</a><br />
"Hello User<br />
<a href="Hello User">Hello User</a><br />
"Hello User"<br />

为什么呢?我该如何解决这个问题?

修改

您可以在此处查看示例http://codepad.org/2Q466lx2

2 个答案:

答案 0 :(得分:2)

原因是[^"]期望匹配一个字符(除了"之外的任何字符)。由于您的第一个Hello User位于字符串的开头,因此失败。

使用负面的lookbehind断言:

$str=preg_replace(
    '#(?<!")(Hello User)#',           
    '<a href="$1">$1</a>',
    $str);

仅当Hello User前面没有"时,才匹配{{1}}。

答案 1 :(得分:1)

功能htmlentities()将"转换为&quot;尝试:

#(?<!&quot;)(Hello User)#