【发布时间】:2018-02-08 01:26:09
【问题描述】:
来自http://php.net/manual/en/function.preg-quote.php:
preg_quote() 采用 str 并在作为正则表达式语法一部分的每个字符前面放置一个反斜杠。如果您有一个需要在某些文本中匹配的运行时字符串并且该字符串可能包含特殊的正则表达式字符,这将非常有用。
特殊的正则表达式字符为:
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -请注意,
/不是特殊的正则表达式字符。
} 是不必要的,但我可以理解为什么他们会为了对称而包含它。例如。以下代码有效:
$re = '/}{This is fine}{/';
preg_match($re, $re, $match);
var_dump($match);
输出是:
array(1) {
[0] =>
string(16) "}{This is fine}{"
}
为什么它们包含 = ! < > :?据我所知,它们只有在被另一个未转义的元字符引入后才会变得特别,例如紧跟在(? 之后,这两个字符也会被转义。 : 在字符类中也可以是特殊的,如下所示:[[:alpha:]],但所有四个括号都会被转义。
【问题讨论】:
-
因为总是逃避所有这些比试图找出它们可能发生的上下文要容易得多。如果您不希望它们逃脱,请不要通过
preg_quote()运行它们。 -
@Sammitch 在什么情况下不会转义它们会导致正则表达式失败?
-
如果您的示例代码中没有特殊字符,并不意味着它根本就没有。仅供参考,从 v7.3 开始,
preg_quote()也会转义#。 -
@revo 如果他们只引用所有 [\x00-\x2F\x3A-\x40\x5B-\x60\7B-7F] 字符(我不记得下划线 [_] 的代码,去掉)。这样他们就不必担心将来更改代码。请注意,如果使用 /x 修饰符,空格 (\x20)、制表符 (\x09)、CR (\x0D) 和 LF (\x0A) 是特殊字符。
-
转义大量字符并不简单,但已经没有想法了。当前负责此转义的 C 代码是带有 21 个
cases 的switch语句。根据PCRE_EXTENDED(x) 修饰符将#添加到列表中。在这种模式下,几乎完全忽略空格。
标签: php regex pcre preg-quote