似乎无法使用preg_replace精确匹配字符串

5

我正在尝试使用php中的preg_replace函数精确匹配一个字符串。 我只想匹配具有单个“@”符号的实例。 我还需要传入一个变量作为模式。

$x = "@hello, @@hello, @hello, @@hello"
$temp = '@hello'

$x = preg_replace("/".$temp."/", "replaced", $x);

结果应该只是这样的:
$x = "replaced, @@hello, replaced, @@hello"

Thank you in advance.

1个回答

4

添加一个负向后行断言(?<!@),如果$temp前面有@,则匹配失败(或者换句话说,如果在@hello前面有@,则不匹配):

$x = "@hello, @@hello, @hello, @@hello";
$temp = '@hello';
$x = preg_replace("/(?<!@)".$temp."/", "replaced", $x);
echo $x;

请查看IDEONE演示

这里还有正则表达式演示

另外,如果您在末尾有整个单词边界,请在模式末尾添加\b,以确保不替换@helloween

"/(?<!@)".$temp."\\b/"

1
如果 $temp 是动态的,请不要忘记使用 preg_quote() - HamZa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接