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);

演示

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

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

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

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

演示

$re = "/^(''$|''(.+''))( ?)/im";
$str = "'$ blah";
$subst = "";
$result = preg_replace($re, $subst, $str);

试试这个。这是有效的。