如何使用preg_replace在PHP中转义$?

6 php regex preg-replace

preg_replace用来逃避特殊字符:

$tmpStr=preg_replace("/\?/", "\?", $tmpStr);
$tmpStr=preg_replace("/\#/", "\#", $tmpStr);
$tmpStr=preg_replace("/\^/", "\^", $tmpStr);
$tmpStr=preg_replace("/\&/", "\&", $tmpStr);
$tmpStr=preg_replace("/\*/", "\*", $tmpStr);
$tmpStr=preg_replace("/\(/", "\(", $tmpStr);
$tmpStr=preg_replace("/\)/", "\)", $tmpStr);
$tmpStr=preg_replace("/\//", "\/", $tmpStr); 
Run Code Online (Sandbox Code Playgroud)

但是我无法$使用相同的功能逃脱:

$tmpStr=preg_replace("/\$/", "\$", $tmpStr);
Run Code Online (Sandbox Code Playgroud)

而且当我使用上面的语句时,所有空格都被替换为$并且$没有被转义.

如何正确逃避美元符号?

sou*_*rge 12

我强烈建议使用preg_quote()代替.

  • @PeterAjtai:我想你误解了`preg_quote()`的目的:它不是针对`preg_replace()`的*second*参数,而是针对*first*。请重新阅读问题和`preg_quote()` 的文档(第二个例子可能对充分理解手头的问题特别有用) (2认同)

小智 6

正确答案是您必须使用 PHP 的转义字符对正则表达式中的反斜杠和美元符号进行转义。

backslash = \\
dollar sign = \$

$tmpStr=preg_replace("/\\\$/", "\\$", $tmpStr);
Run Code Online (Sandbox Code Playgroud)

这对于需要匹配包含美元符号的字符串的任何人都很有用。


amp*_*ine 5

看来你的问题是逃避之一。'PHP 中的单引号 ( ) 与双引号 ( ") 的工作方式不同。这很像 Perl 中的情况,其中变量插值不会发生在单引号字符串中,并且美元符号 ( $) 不是元字符:

print "\$"; # prints $
print '\$'; # prints \$
Run Code Online (Sandbox Code Playgroud)

另外,Perl 的字符类将简化您的代码:

$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
Run Code Online (Sandbox Code Playgroud)