php - preg_match 如何处理使用\Q..\E 时的定界符?

标签 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 时似乎是这样涉及,那么它不会以相同的方式处理转义的定界符。

在这种情况下究竟发生了什么?

谢谢!

最佳答案

\Q\E 可用于忽略模式中的正则表达式元字符。

例如,如果文字字符串包含分隔符/,则正则表达式编译失败或匹配失败,因为它试图匹配用于转义分隔符的转义字符。 \Q\E 之间的定界符应被视为文字字符,而不是定界符。

preg_match('~\Q http:// \E~', ' http:// ', $match);
var_dump($match);

# => array(1) { [0]=> string(7) " http:// " }

使用preg_quote()如果分隔符可能出现在 \Q\E

中,则代替 \Q\E
$text = ' http:// ';

preg_match('/' . preg_quote($text, '/') . '/', $text, $match);
var_dump($match);

# => array(1) { [0]=> string(9) " http:// " }

关于php - preg_match 如何处理使用\Q..\E 时的定界符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20518758/

相关文章:

javascript - 使用 Jquery 动态加载新内容

java - 在 Java 中用 '\' 替换单个 '\\'

java - 编译时 SQL 中的单个代码问题

python - 用于匹配两个字符之间的文本同时忽略反斜杠字符的正则表达式

regex - 是否可以检查两组是否相等?

javascript - Javascript/PHP 中的 HTML 转义/编码

javascript - 使用ajax发布文件和数据

php - 显示所有产品而不是只显示一个

php - 从 BLOB 确定图像的 MIME 类型?

regex - 在egrep的正则表达式中管道bash输入参数