考虑字符串
$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