我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()代替.
小智 6
正确答案是您必须使用 PHP 的转义字符对正则表达式中的反斜杠和美元符号进行转义。
backslash = \\
dollar sign = \$
$tmpStr=preg_replace("/\\\$/", "\\$", $tmpStr);
Run Code Online (Sandbox Code Playgroud)
这对于需要匹配包含美元符号的字符串的任何人都很有用。
看来你的问题是逃避之一。'PHP 中的单引号 ( ) 与双引号 ( ") 的工作方式不同。这很像 Perl 中的情况,其中变量插值不会发生在单引号字符串中,并且美元符号 ( $) 不是元字符:
print "\$"; # prints $
print '\$'; # prints \$
Run Code Online (Sandbox Code Playgroud)
另外,Perl 的字符类将简化您的代码:
$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
Run Code Online (Sandbox Code Playgroud)