我正在使用正则表达式,我尝试了\ Q .. \ E转义序列。
首先尝试:
$regex = '/\Q http:// \E/';
var_dump(preg_match($regex, ' http:// '));
它告诉我'''是未知的修饰符,完全可以理解。
第二次尝试:
$regex = '/\Q http:\/\/ \E/';
var_dump(preg_match($regex, ' http:// '));
var_dump(preg_match($regex, ' http:\/\/ '));
它运行,与第一个字符串不匹配,但与第二个字符串匹配。
我知道我可以使用其他分隔符或在没有\ Q .. \ E的情况下解决它,但我很好奇它是如何工作的。
我首先通过分隔符将正则表达式与修饰符分开(如果需要,处理转义),然后正则表达式引擎解释\ Q .. \ E,但看起来像是\ Q涉及,然后它不会以相同的方式处理转义分隔符。
在这种情况下会发生什么?
谢谢!
答案 0 :(得分:2)
\Q
和\E
可用于忽略模式中的正则表达式元字符。
例如,如果文字字符串包含分隔符/
,则正则表达式编译失败或匹配失败,因为它尝试匹配用于转义分隔符的转义字符。介于\Q \E
之间的分隔符应视为字面字符,而不是分隔符。
preg_match('~\Q http:// \E~', ' http:// ', $match);
var_dump($match);
# => array(1) { [0]=> string(7) " http:// " }
如果分隔符可能出现在\Q \E
preg_quote()
代替\Q \E
$text = ' http:// ';
preg_match('/' . preg_quote($text, '/') . '/', $text, $match);
var_dump($match);
# => array(1) { [0]=> string(9) " http:// " }
答案 1 :(得分:1)
为什么\Q...\E
语法不支持分隔符?
由于\E
是可选的,因此知道模式结束位置的唯一方法是分隔符。这就是为什么它是\Q..\E
语法的例外。
答案 2 :(得分:1)
定义如下:
Character: \Q...\E
Description: Matches the characters between \Q and \E literally, suppressing the meaning of special characters
陈述here和here的特殊字符是:
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
用作分隔符的每个非字母数字,非反斜杠,非空白字符不被视为特殊字符类,而只是分隔符,因此我们将发现:
var_dump(preg_match("+\Q+\E+", "+"));
会抛出类似的错误:
Warning: preg_match(): Unknown modifier '\'
答案 3 :(得分:0)
正则表达式分隔符(在这种情况下)似乎在文字字符串(\ Q ... \ E)中奇怪地处理。它是一个分隔符,所以你需要转义它,所以preg可以从选项中解析出正则表达式。但似乎这并没有阻止\ Q和\ E从他们的工作中解释反斜杠斜线序列作为文字,而不是逃避。
如果您使用不同的分隔符,事情就会按预期工作:
var_dump(preg_match('@\Q http:// \E@', ' http:// '));