在PHP中的preg_match()中使用一个/两个反斜杠转义斜杠?

时间:2016-09-06 04:00:03

标签: php regex

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

示例代码:

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

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

他们都提供相同的输出

int(1)

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

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

1 个答案:

答案 0 :(得分:2)

那是完全一样的。

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

很好,正则表达式引擎只接收一个反斜杠,在两种情况下都会转义分隔符/

注意:要计算用引号字符串编写的模式的文字反斜杠,您需要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;

# \\