【问题标题】:How to escape $ in PHP using preg_replace?如何使用 preg_replace 在 PHP 中转义 $?
【发布时间】:2010-10-20 13:02:29
【问题描述】:

我正在使用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);

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

如何正确转义美元符号?

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    我强烈建议改用preg_quote()。

    【讨论】:

    • 如果这个答案给出了使用 preg_quote 而不是 preg_replace 的理由,我会发现它更有帮助。另外,很高兴知道为什么 preg_replace 方法不能用于转义美元符号。
    • @RandallStewart “preg_quote 而不是 preg_replace”?这两个函数是不可替换的,你不能用一个代替另一个,你使用preg_quote来转义正则表达式字符串中的值(在preg_replace内部使用)
    • 这会在其他地方产生bug。例如‌‌preg_replace('/\{\s*price\s*\}/', preg_quote('$100.00'), 'it cost {price}'); 将返回‌it cost $100\.00 而不是预期的‌it cost $100.00
    • @PeterAjtai:我想你误解了preg_quote()的目的:不是preg_replace()的second参数,而是first我>。请重新阅读preg_quote() 的问题和文档(第二个示例可能对充分理解手头的问题特别有用)
    • 谢谢@soulmerge 我看到了区别。
    【解决方案2】:

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

    backslash = \\
    dollar sign = \$
    
    $tmpStr=preg_replace("/\\\$/", "\\$", $tmpStr);
    

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

    【讨论】:

    • 我认为这应该是问题的正确答案,也有解释,因为在我的情况下 preg_quote 也有替换美元符号的问题,这个双转义版本解决了它。
    【解决方案3】:

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

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

    我还建议您改用addslashes。

    【讨论】:

      【解决方案4】:

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

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

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

      $tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
      

      【讨论】:

        【解决方案5】:

        是的,似乎\\$ 被 PHP 视为双引号字符串中的 $。 这意味着您必须通过说 \\\$ 让 PHP 看到 \$。

        我刚刚尝试了preg_replace("/\\\$$k\\\$/", $v, $data),它确实有效(将出现的$KEY$ 替换为VALUE。

        【讨论】:

          【解决方案6】:

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

          你也可以试试

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

          【讨论】:

            【解决方案7】:

            PHP 不是将 \$ 视为 $ 吗? 这个我没测试过,可能是这样的;

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

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

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

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

            【讨论】:

              【解决方案8】:
              $pattern = preg_replace('/\$(.+)/', '\\\$$1', $pattern);
              

              【讨论】:

              • 您能否添加一些有关您的代码的详细信息以及它如何解决问题中的问题?仅代码答案不是很有用,特别是对于偶然发现这篇文章的未来读者。谢谢,
              【解决方案9】:

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

              $tmpStr = str_replace('$', '$',$tmpStr);
              

              【讨论】:

                【解决方案10】:

                试试 addlashes() 吗?

                检查 php.net / addslashes()

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-01-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-05
                  相关资源
                  最近更新 更多