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

时间:2009-04-20 10:35:14

标签: 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); 

但是我无法使用相同的函数逃避$

$tmpStr=preg_replace("/\$/", "\$", $tmpStr);

而且,当我使用上述语句时,所有空格都被$替换,$没有被转义。

如何正确逃避美元符号?

10 个答案:

答案 0 :(得分:12)

我强烈建议改用preg_quote()

答案 1 :(得分:4)

$ sign必须自行转义

$tmpStr=preg_replace("/$$/", "\$", $tmpStr);

我还建议改为addslashes

答案 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()?

检查 php.net / addslashes()