PHP preg_replace 匹配特殊字符 '$' 时的意外输出

PHP preg_replace unexpected Output in case of matching special Character '$'

我在 PHP 脚本中遇到问题,如果此函数用于正则表达式匹配和替换。 我在 www.regex101.com 上测试了我的正则表达式并得到了预期的结果,但在 PHP.

中却没有

我在函数中使用了这个模式:

$matchedName = preg_replace("/^($|\(.+\))( ?)/", "", $name);

匹配字符“$”或开头括号中的任何表达式并将其删除。任何带括号的输入都可以正常工作。

$name = "$ blah";
$matchedName = preg_replace("/^($|\(.+\))( ?)/", "", $name);
var_dump($matchedName);

Output:
string(8) "$ blah"

现在,我是不是误会了什么?或者这个函数在“$”字符的情况下真的是一个问题?

感谢任何回复

你需要转义\,所以你的代码应该是:

$name = "$ blah";
$regex = "/^(\$|\(.+\))( ?)/";
$matchedName = preg_replace($regex, "", $name);

var_dump($regex);
var_dump($matchedName);

Demo

问题是你在双引号中 ("..."),所以 PHP 解释器将第一个 \ 解释为只是转义字符串中的 $ ,而不是文字 \。为了转义正则表达式中的字符,它需要是文字 \

因此,在处理器解释后,您的实际正则表达式如下所示:/^($|\(.+\))( ?)/。您需要转义双引号内的 $ 在正则表达式上下文中提供斜杠,因此您添加 \.

请注意,您可以通过简单地使用单引号 ('...') 来避免这种情况,您只需要 $ 而不是 \$:

$name = "$ blah";
$regex = '/^($|\(.+\))( ?)/';
$matchedName = preg_replace($regex, "", $name);

var_dump($regex);
var_dump($matchedName);

Demo

$re = "/^(\$|\(.+\))( ?)/im";
$str = "$ blah";
$subst = "";

$result = preg_replace($re, $subst, $str);

尝试 this.This 有效。