【问题标题】:Differenc between escaping slash with one/two backslash in preg_match() in PHP?PHP中preg_match()中的转义斜杠与一个/两个反斜杠之间的区别?
【发布时间】:2016-09-06 04:00:03
【问题描述】:

在正则表达式中有时我会遇到正斜杠,我尝试使用一个反斜杠和两个反斜杠对其进行转义,并实现返回是相同的。所以我想更清楚地理解它。

示例代码:

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

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

它们都给出相同的输出

int(1)

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

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

【问题讨论】:

  • 有区别。在第一个带有两个反斜杠的情况下,您可以转义反斜杠,使其成为文字。在第二个你转义正斜杠,使其成为文字。
  • @CharlotteDunois 我曾经认为反斜杠成为文字,但如果是这种情况,那么第一个示例 var_dump(preg_match("/^\\/$/D", "/")); 不应该匹配,因为我只提供 "/" 作为主题。但是如果反斜杠变成文字,那么它应该匹配 "\/" 。如果我误解了什么,请纠正我。谢谢

标签: php regex


【解决方案1】:

完全一样。

在带引号的或 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

注意:唯一所见即所得的字符串是 nowdoc 字符串:

echo <<<'EOD'
\\
EOD;

# \\

【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2016-11-20
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多