Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么使用的分隔符会影响正则表达式的有效性?_Php_Regex - Fatal编程技术网

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

Php 为什么使用的分隔符会影响正则表达式的有效性?,php,regex,Php,Regex,我使用这个非常简单的正则表达式: ^[\x20-\x7E]+$ 当我尝试将它与一些PHP正则表达式函数一起使用时,例如当我使用~character tilde作为分隔符时,它在唯一情况下抛出警告 所以,下面几行的执行进展顺利 preg_match("/^[\x20-\x7E]+$/", $s); # delimiter "/" preg_match("!^[\x20-\x7E]+$!", $s); # delimiter "!" preg_match("#^[\x20-\x7E]+$#", $

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

^[\x20-\x7E]+$
当我尝试将它与一些PHP正则表达式函数一起使用时,例如当我使用~character tilde作为分隔符时,它在唯一情况下抛出警告

所以,下面几行的执行进展顺利

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
注意:只有当它与双引号一起使用时才会发生

我一直使用tilde作为分隔符,在这种情况下我从未遇到过问题,我真的很想知道为什么会发生这种情况。找不到tilde在正则表达式中有什么特殊意义吗我现在99%确定它没有,或者它只是一个bug


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

您使用的是双引号:

 "~^[\x20-\x7E]+$~"
这意味着\x20和\x7E都是在PHP字符串上下文中解释的,而不是通过PCRE。猜猜这意味着什么

正如@Bitwise提到的,使用单引号。或者更好的方法是逃出逃逸序列:

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

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

您使用的是双引号:

 "~^[\x20-\x7E]+$~"
这意味着\x20和\x7E都是在PHP字符串上下文中解释的,而不是通过PCRE。猜猜这意味着什么

正如@Bitwise提到的,使用单引号。或者更好的方法是逃出逃逸序列:

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

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

那么就用别的东西吧@戈登姆的问题不是如何解决这个问题,而是它为什么会发生;嗯,它认为$~是一个变量吗?试试单引号…'~^[\x20-\x7E]+$~'@rock321987可能是PHP5.4.16的问题,这行代码实际上就像preg_match~^[\x20-\x7E]+$~,$s===1{…},其中$s是任何字符串。在PHP5.5中,这行代码是相同的-然后使用其他字符串即可@戈登姆的问题不是如何解决这个问题,而是它为什么会发生;嗯,它认为$~是一个变量吗?试试单引号…'~^[\x20-\x7E]+$~'@rock321987可能是PHP5.4.16的问题,这行代码实际上就像preg_match~^[\x20-\x7E]+$~,$s==1{…},其中$s是任何字符串。在PHP5.5中,同样的-很好,转义真的很有帮助。。。但是仍然有一个问题,~和or之间有什么区别!从PCRE的角度来看,作为分隔符。。。对于其他分隔符,我不必转义,表达式仍然在双引号之间;没有区别。您的tilde正则表达式失败,因为PCRE看到[-~]一个未替换的分隔符。PCRE并不真正了解PHPs分隔符。另请看:@mario Aw,我现在看到7E实际上是一个波浪形角色!起初我还没有意识到这一点。问题解决了!或者更好的方法是不用使用双引号,然后转义不需要的插值也不会更好。很好,转义真的很有帮助。。。但是仍然有一个问题,~和or之间有什么区别!从PCRE的角度来看,作为分隔符。。。对于其他分隔符,我不必转义,表达式仍然在双引号之间;没有区别。您的tilde正则表达式失败,因为PCRE看到[-~]一个未替换的分隔符。PCRE并不真正了解PHPs分隔符。另请看:@mario Aw,我现在看到7E实际上是一个波浪形角色!起初我还没有意识到这一点。问题解决了!或者更好地使用双引号而不需要,然后转义不需要的插值也不是更好。