preg_replace()函数问题?

时间:2010-11-10 13:09:01

标签: php regex

请看这个简单的脚本

$a = "test";
echo $b = preg_replace('/[^a](e)/',"<b>$1</b>",$a); // returns <b>e</b>st

如果前面没有“a”字符,我想加粗“e”字符。

逻辑上$0它必须与"te"匹配,$1 - "e",但为什么它会删除我示例中的第一个字符?

我可以用另一种方式解决这个问题,但我想了解这种行为。

非常感谢

4 个答案:

答案 0 :(得分:3)

  

为什么它会删除我示例中的第一个字符?

因为匹配是两个字符宽:e和它之前的字符(由[^a]表示)。

要改变这种情况,有两种方法。简单就是用你的比赛括起来:

echo $b = preg_replace('/([^a])(e)/',"$1<b>$2</b>",$a); // returns t<b>e</b>st

第二种是使用negative lookbehind

echo $b = preg_replace('/(?<!a)(e)/',"<b>$1</b>",$a); // returns t<b>e</b>st

答案 1 :(得分:2)

您的错误是/[^a](e)/ 没有表示匹配“e”时前面没有“a”。相反,它表示匹配非“a”和“e”,并保存“e”。

您需要/(?<!a)(e)/。这就是说,当它之前没有“a”时,匹配“e”,这就是你所说的你想要的。

答案 2 :(得分:1)

@Coronatus为您提供解决问题的代码。您遇到它的原因如下:

preg_replace('/[^a](e)/',"<b>$1</b>",$a) '/[^a](e)/'部分匹配te测试,但只存储e(这是你在括号中唯一的东西)。因此,当您执行替换时,您将使用粗体存储值(te)替换匹配的部分(e)。这就是你输掉第一个角色的原因。

代码的另一个选项是:

preg_replace('/([^a])(e)/', '$1<b>$2</b>', $a);

答案 3 :(得分:0)

preg_replace('/([^a])e/', '$1<b>e</b>', $a);