我使用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);
但是我无法使用相同的函数逃避$
:
$tmpStr=preg_replace("/\$/", "\$", $tmpStr);
而且,当我使用上述语句时,所有空格都被$
替换,$
没有被转义。
如何正确逃避美元符号?
答案 0 :(得分:12)
我强烈建议改用preg_quote()。
答案 1 :(得分:4)
答案 2 :(得分:4)
正确的答案是你必须使用PHP的转义字符来逃避正则表达式中的反斜杠和美元符号。
backslash = \\
dollar sign = \$
$tmpStr=preg_replace("/\\\$/", "\\$", $tmpStr);
这对于需要匹配包含美元符号的字符串的任何人都很有用。
答案 3 :(得分:3)
看起来你的问题是逃避问题。 PHP中的单引号('
)与双引号("
)的工作方式不同。这与Perl非常相似,在单引号字符串中不会发生变量插值,而美元符号($
)不是元字符:
print "\$"; # prints $
print '\$'; # prints \$
此外,Perl的字符类将简化您的代码:
$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
答案 4 :(得分:2)
是的,似乎PHP \\$
在双引号字符串中看作$
。
这意味着你必须通过说\$
来使PHP看到\\\$
。
我刚尝试了preg_replace("/\\\$$k\\\$/", $v, $data)
,确实有效(用{$}替换$KEY$
的出现次数。
答案 5 :(得分:0)
IIRC你用$替换$。所以它应该是$$
您也可以尝试
$tmpStr=preg_replace('/\$/', '\$', $tmpStr);
答案 6 :(得分:0)
PHP认为\ $为$是不是真的? 我没有测试过这个,它可能会像这样;
php是第一个,用“/ $ /”替换你的“/ \ $ /” 然后preg引擎做了它的魔术..不幸的是,$是一个正则表达式运算符(我相信它匹配字符串的结尾?),所以它没有在你的文本中找到$ -characters但是
我认为,你需要做的就是让这个$ -character躲过这样的事情;
$ tmpStr = preg_replace(“/ \ $ /”,“\ $”,$ tmpStr);
另外..在这种情况下,我会使用str_replace()
答案 7 :(得分:0)
$pattern = preg_replace('/\$(.+)/', '\\\$$1', $pattern);
答案 8 :(得分:-1)
在PHP中,对于HTML中使用的“$”的特定情况,您还可以为其实体执行先前的替换:
$tmpStr = str_replace('$', '$',$tmpStr);
答案 9 :(得分:-1)
尝试使用addslashes()?