如何用@@而不是@或@@@替换字符串开头?

时间:2015-09-04 22:02:15

标签: php regex string

考虑字符串

$str="hello @jack, tell @sam,@@jake and @@sam and @@@jake and @tom/@jim and @@jake hello"

是否可以替换仅以@@而非@@@@开头的特定用户名(例如插孔)?

我的意思是,是否可以仅以特定数量@开头的字符串?

这就是我试过的

$user = "jack";
$str = preg_replace('~@@'.$user.'~', '[['.$user.']]', $str);

问题是,这会将@@jack@@@jack替换为 jack @ jack

1 个答案:

答案 0 :(得分:2)

您需要指定必要的@号并使用否定look-behind

(?<!@)@@jake\b

demo。这将匹配jake作为整个单词(由于单词边界\b),前面只有2 @ s(作为(?<!@)否定后卫检查是否存在@在第一个@之前,如果是,则与第一个@不匹配。

要匹配前面只有4 @个符号的字词,请使用(?<!@)@{4}word\b。仅对一个@,使用(?<!@)@word\b

示例code demo

$str="hello @jack, tell @sam,@@jake and @@sam and @@@jake and @tom/@jim and @@jake hello";
$user = "jake";
$number_of_prefixes = 2;
$str = preg_replace('~(?<!@)@{' . $number_of_prefixes . '}'.$user.'\b~', '[['.$user.']]', $str);
echo $str;

输出:hello @jack, tell @sam,[[jake]] and @@sam and @@@jake and @tom/@jim and [[jake]] hello