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

Wh1*_*Ck5 1 php regex

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

^[\x20-\x7E]+$
Run Code Online (Sandbox Code Playgroud)

当我尝试将它与一些PHP正则表达式函数一起使用时,例如preg_match(),当我使用~字符(代字号)作为分隔符时,它会在单一情况下抛出警告.

因此,执行以下行很顺利

preg_match("/^[\x20-\x7E]+$/", $s); # delimiter "/"
preg_match("!^[\x20-\x7E]+$!", $s); # delimiter "!"
preg_match("#^[\x20-\x7E]+$#", $s); # delimiter "#"
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这条线

preg_match("~^[\x20-\x7E]+$~", $s); # delimiter "~"
Run Code Online (Sandbox Code Playgroud)

发出警告

Warning: preg_match(): Unknown modifier ']' in some_script.php on line XX
Run Code Online (Sandbox Code Playgroud)

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

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

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

mar*_*rio 5

你使用的是双引号:

 "~^[\x20-\x7E]+$~"
Run Code Online (Sandbox Code Playgroud)

这意味着,无论\x20\x7E得到了在PHP字符串上下文,而不是由PCRE解释.猜猜是多少\x7E.

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

 "~^[\\x20-\\x7E]+$~"
Run Code Online (Sandbox Code Playgroud)

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