正则表达式搜索反斜杠

时间:2014-10-07 21:54:01

标签: php regex escaping

为什么在正则表达式中搜索反斜杠时需要反转4次反斜杠?

示例:

$pattern = '/\\\\/';
$string = 'to\m';
preg_match( $pattern, $string, $matches );

echo "<pre>";
print_r($matches);
echo "</pre>";

返回:

Array
(
    [0] => \
)

3 个答案:

答案 0 :(得分:3)

因为有两个级别的解析,一次是PHP,另一次是正则表达式引擎:

  1. 预定目标:\
  2. 我需要把它放在一个字符串中,而不是在它之后转义字符:"\\",PHP看到\
  3. 现在我需要将其提供给正则表达式:"\\\\" PHP看到\\,正则表达式引擎看到\
  4. 函数preg_quote()将通过为您转义所有正则表达式元字符来为您消除一层混乱。例如:

    $foo = preg_quote("c:\\some\\path\\or_whatever");
    preg_match("/$foo/", $bar);
    

    修改

    您似乎将此视为&{34} \\&#34;的单位,这似乎并不能准确描述正在发生的事情。为了更好的例子,让我们使用一个在PHP和正则表达式中都很重要的不同字符$

    1. 预定目标:$
    2. 转义PHP字符串:"\$",PHP看到的文字字符串为$
    3. 转义为在正则表达式中将PHP字符串解释为文字$
      "\\\$",PHP看到文字字符串\$,正则表达式看到文字字符串$
    4. 用不同风格的括号表示,表示不同的转义级别:

      0: $     $
      1: \$    [\$]
      2: \\\\  [{\\}{\$}]
      
      0: \     \
      1: \\    [\\]
      2: \\\\  [{\\}{\\}]
      
      0: \\server\$c\Windows
      1: [\\][\\]server[\\][\$]c[\\]Windows
      2: [{\\}{\\}][{\\}{\\}]server[{\\}{\\}][{\\}{\$}]c[{\\}{\\}]Windows
      

      这也说明了为什么处理Windows路径很糟糕。

答案 1 :(得分:1)

这是因为反斜杠在php字符串和正则表达式中都有特殊含义,所以你必须将它转义两次:

要匹配单个反斜杠,纯正则表达式应为:

/\\/

如果是:

/\/

,反斜杠将转义正斜杠,导致无效的正则表达式匹配单个正斜杠,但缺少它的结尾斜杠。

然后,这个纯正则表达式被放入一个php字符串,每个反斜杠都被转义:

'/\\\\/'

答案 2 :(得分:1)

因为反斜杠是一个特殊字符,所以需要将其转义两次。所以\\为第一个反斜杠,\\为第二个反斜杠。