为什么在正则表达式中,单个反斜杠和双反斜杠都可以执行相同的转义?

6

我正在尝试匹配008/

preg_match('/008\\//i', '008/', $matches);
preg_match('/008\//i', '008/', $matches);

我的问题是为什么这两个正则表达式都能够工作。我本来以为只有第二个正则表达式能够工作,但为什么双反斜杠的那个也能够工作呢?


你问题中的示例试图匹配正斜杠,而不是反斜杠。 - Barmar
如果你不知道的话,斜杠 / 作为分隔符是完全任意的。当我搜索包含斜杠的内容时,我经常会像这样做 preg_match('#008/#', $string, $matches),这样我就可以避免转义。 - miken32
1个回答

5
因为在PHP字符串中,\\ 表示“转义反斜杠”。由于 \/ 没有特殊含义,因此不需要转义(尽管可以),因此它们的值相同。
换句话说,这两个代码都会输出相同的结果:
echo '/008\\//i'; // prints /008\//i
echo '/008\//i';  // prints /008\//i

反斜杠是单引号字符串中可以转义的少数字符之一(除了显而易见的\'),这确保您可以创建一个字符串,例如'test\\',而无需转义最后一个引号。

正则表达式中以斜杠“/”为分隔符时,需要转义斜杠“/”。尽管最终结果相同,但是传递给 PCRE 代码的是这个字符串。 - miken32
是的,我的意思是由于 '\/' 不会被解释为任何特殊字符,所以它与 '\\/' 的效果相同。显然,这个特定的正则表达式需要对斜杠进行转义,而两个示例都做到了这一点,这就是为什么两者都能够工作(它们是相同的)。 - Mathias-S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接