我使用这个非常简单的正则表达式:
~
当我尝试将它与一些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%没有),或者它只是一个错误。
我当然可以解决这个问题,但问题是:代字号和其他分隔符之间有什么区别?
答案 0 :(得分:5)
您使用的是双引号:
"~^[\x20-\x7E]+$~"
这意味着\x20
和\x7E
都在PHP字符串上下文中解释,而不是由PCRE解释。猜猜\x7E
等于什么。
正如@Bitwise所提到的,使用单引号。或者更好的逃避逃脱序列:
"~^[\\x20-\\x7E]+$~"
因此,正则表达式引擎仍会看到[\x20-\x7E]
而不是[ -~]
。