当\ Q .. \ E使用时,preg_match如何处理分隔符?

时间:2013-12-11 12:09:20

标签: php regex escaping preg-match

我正在使用正则表达式,我尝试了\ 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涉及,然后它不会以相同的方式处理转义分隔符。

在这种情况下会发生什么?

谢谢!

4 个答案:

答案 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
陈述herehere

特殊字符是:

. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

用作分隔符的每个非字母数字,非反斜杠,非空白字符不被视为特殊字符类,而只是分隔符,因此我们将发现:

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:// '));