请看这个简单的脚本
$a = "test";
echo $b = preg_replace('/[^a](e)/',"<b>$1</b>",$a); // returns <b>e</b>st
如果前面没有“a”字符,我想加粗“e”字符。
逻辑上$0
它必须与"te"
匹配,$1
- "e"
,但为什么它会删除我示例中的第一个字符?
我可以用另一种方式解决这个问题,但我想了解这种行为。
非常感谢
答案 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)/'
部分匹配t
和e
测试,但只存储e
(这是你在括号中唯一的东西)。因此,当您执行替换时,您将使用粗体存储值(te
)替换匹配的部分(e
)。这就是你输掉第一个角色的原因。
代码的另一个选项是:
preg_replace('/([^a])(e)/', '$1<b>$2</b>', $a);
答案 3 :(得分:0)
preg_replace('/([^a])e/', '$1<b>e</b>', $a);