【问题标题】:How to properly escape a string for use in regular expression in PHP?如何正确转义字符串以用于 PHP 中的正则表达式?
【发布时间】:2015-10-30 11:43:42
【问题描述】:

我正在尝试转义一个字符串以在 PHP 中的正则表达式中使用。到目前为止,我尝试过:

preg_quote(addslashes($string));

我认为我需要addslashes 才能正确解释字符串中的任何引号。然后preg_quote 转义正则表达式字符。

但是,问题是引号用反斜杠转义,例如\'。但随后preg_quote 用另一个反斜杠转义,例如\\'。因此,这使报价再次未转义。切换这两个函数也不起作用,因为这会留下一个未转义的反斜杠,然后将其解释为特殊的正则表达式字符。

PHP中是否有一个函数来完成这个任务?或者怎么做?

【问题讨论】:

  • 你的正则表达式在哪里?也发一下
  • 哦,我认为问题与我使用的实际正则表达式无关。目前我正在尝试使用'\(?i)(?<=^|[^a-z])'.preg_quote(addslashes($string)).'\i',但它不起作用。
  • 您的分隔符错误,请改用斜杠或波浪线。 addslashes 没用。使用preg_quote 第二个参数。请注意(?<=^|[^a-z])(?<![a-z]) 相同
  • 你只需要'/(?<![a-z])'.preg_quote($string, '/').'/i'
  • @Daniel :看看 php 手册。 (或使用包含所有 php 函数描述的 aptana 之类的 IDE)

标签: php regex string escaping


【解决方案1】:

正确的做法是使用preg_quote,并指定使用的pattern delimiter

preg_quote() 接受 str 并在正则表达式语法的每个字符前面放置一个反斜杠...字符是:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

尝试使用反斜杠作为分隔符是一个坏主意。通常您选择一个字符,该字符未在模式中使用。常用的是斜线/pattern/波浪号~pattern~数字符号#pattern#百分号@ 987654328@。也可以使用括号样式分隔符:(pattern)

@CasimiretHippolyte 和 @anubhava 在 cmets 中提到的带有修改的正则表达式。

$pattern = '/(?<![a-z])' . preg_quote($string, "/") . '/i';

也许想使用\b word boundary。无需任何额外的转义。

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 2021-09-08
    • 2010-09-21
    相关资源
    最近更新 更多