PHP中preg_match()用一个/两个反斜杠转义斜杠的区别


Differenc between escaping slash with one/two backslash in preg_match() in PHP?

在正则表达式中有时我遇到正斜杠,我试图用一个反斜杠和两个反斜杠来转义它,并意识到返回是相同的。所以我想更清楚地了解它。

示例代码:

var_dump(preg_match("/^''/$/D", "/"));
var_dump(preg_match("/^'/$/D", "/"));

它们都给出相同的输出

int(1)

在我的理解中,用两个反斜杠转义它似乎是正确的,因为当PHP解析字符串时,第一个反斜杠(')转义第二个反斜杠('),当解析正则表达式时,反斜杠(')然后转义正斜杠(/)。

它们之间有什么区别吗?谢谢你。

完全一样。

在引号或heredoc字符串中,您可以用一个或两个反斜杠表示文字反斜杠。这种特殊性是由于反斜杠被用作这类字符串的转义字符。您可以显示字符串来确认这一事实。

总之,在这两种情况下,regex引擎只接收一个转义分隔符/的反斜杠。

注意:为一个用引号括起来的字符串表示的模式,你需要3或4个反斜杠(因为反斜杠也是该模式的转义字符,必须第二次转义):

var_dump(preg_match('~^a'''o$~', 'a'o'));
var_dump(preg_match('~^a''''o$~', 'a'o'));
var_dump(preg_match('~^a'''o$~', 'a''o'));
var_dump(preg_match('~^a''''o$~', 'a''o'));

和其他字符一样,要在带引号的字符串中表示反斜杠,只需要写一次,但是由于该字符用于转义,因此有时需要写两个反斜杠来消除歧义,特别是在转义序列后面的时候。例子:

echo "a'b"; # a'b
echo 'a'b'; # a'b
echo "a''b"; # a'b
echo 'a''b'; # a'b
echo "a'tb";   # a    b
echo "a''tb";  # a'tb
echo "a'''tb"; # a'    b
echo 'a''b';   # a'b
echo 'a'''b';  # parse error
echo 'a''''b'; # a''b
注意:唯一的wysiwyg类型的字符串是nowdoc字符串:
echo <<<'EOD'
''
EOD;
# ''