9

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

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

如何正确转义美元符号?

4

10 回答 10

13

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

于 2009-04-20T10:42:02.827 回答
6

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

backslash = \\
dollar sign = \$

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

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

于 2011-08-23T18:31:33.420 回答
5

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

print "\$"; # prints $
print '\$'; # prints \$

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

$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
于 2010-05-22T03:04:13.193 回答
4

$ 符号必须自行转义,所以

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

我还建议改用addlashes

于 2009-04-20T10:43:32.683 回答
2

是的,PHP 似乎将\\$其视为$双引号字符串。这意味着您必须让 PHP\$看到\\\$.

我刚刚尝试过preg_replace("/\\\$$k\\\$/", $v, $data),它确实有效($KEY$用 VALUE.

于 2012-11-01T10:13:35.043 回答
0

IIRC你用$替换$。所以应该是$$

你也可以试试

$tmpStr=preg_replace('/\$/', '\$', $tmpStr);
于 2009-04-20T10:38:21.197 回答
0

PHP 将 \$ 视为 $ 不是真的吗?我还没有测试过,它可能会这样;

php 是第一个,并用“/$/”替换你的“/\$/”然后 preg 引擎确实很神奇.. 不幸的是,$ 是一个正则表达式运算符(我相信它匹配字符串的结尾?),所以它不会在您的文本中找到 $-characters 但会

我认为,您需要做的是像这样双重转义 $ 字符;

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

另外..在这种情况下,我会使用 str_replace()

于 2009-04-20T10:47:35.980 回答
-1
$pattern = preg_replace('/\$(.+)/', '\\\$$1', $pattern);
于 2016-03-17T07:49:07.583 回答
-2

在 PHP 中,对于 HTML 中使用的“$”的特殊情况,您还可以对其实体进行先前的替换:

$tmpStr = str_replace('$', '$',$tmpStr);
于 2015-02-03T16:00:17.017 回答
-2

试试 addlashes() 吗?

检查 php.net/addslashes()

于 2015-06-12T13:48:14.323 回答