如何替换只以@@而不以@或@@开头的字符串


How to replace string begining with @@ only and not @ or @@@?

考虑字符串

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

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

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

这是我尝试过的

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

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

您需要指定@的必要数量,并使用反向查看:

(?<!@)@@jake'b

看演示。这将匹配jake作为一个完整的词(由于词边界'b),前面只有2个@(因为(?<!@)负向后看检查是否在第一个@之前有@,如果有,则不匹配第一个@)。

要匹配前面只有4个@符号的单词,请使用(?<!@)@{4}word'b。如果只有一个@,则使用(?<!@)@word'b

示例代码演示:

$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