为什么使用的分隔符会影响正则表达式的有效性?

时间:2016-06-26 07:28:24

标签: php regex

我使用这个非常简单的正则表达式:

~

当我尝试将它与一些PHP正则表达式函数一起使用时,例如preg_match(),当我使用preg_match("/^[\x20-\x7E]+$/", $s); # delimiter "/" preg_match("!^[\x20-\x7E]+$!", $s); # delimiter "!" preg_match("#^[\x20-\x7E]+$#", $s); # delimiter "#" 字符(代字号)作为分隔符时,它会在单一情况下抛出警告。

因此,执行以下行很顺利

preg_match("~^[\x20-\x7E]+$~", $s); # delimiter "~"

但出于某种原因,这一行

Warning: preg_match(): Unknown modifier ']' in some_script.php on line XX

发出警告

{{1}}

注意:只有当它与双引号一起使用时才会发生!

我一直使用代字号作为分隔符,直到这种情况从未遇到问题,并且真的很想知道为什么会发生这种情况。找不到代字号在正则表达式中有一些特殊的含义(我现在确定99%没有),或者它只是一个错误。

我当然可以解决这个问题,但问题是:代字号和其他分隔符之间有什么区别?

1 个答案:

答案 0 :(得分:5)

您使用的是双引号:

 "~^[\x20-\x7E]+$~"

这意味着\x20\x7E都在PHP字符串上下文中解释,而不是由PCRE解释。猜猜\x7E等于什么。

正如@Bitwise所提到的,使用单引号。或者更好的逃避逃脱序列:

 "~^[\\x20-\\x7E]+$~"

因此,正则表达式引擎仍会看到[\x20-\x7E]而不是[ -~]