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