为什么在正则表达式中搜索反斜杠时需要反转4次反斜杠?
示例:
$pattern = '/\\\\/';
$string = 'to\m';
preg_match( $pattern, $string, $matches );
echo "<pre>";
print_r($matches);
echo "</pre>";
返回:
Array
(
[0] => \
)
答案 0 :(得分:3)
因为有两个级别的解析,一次是PHP,另一次是正则表达式引擎:
\
"\\"
,PHP看到\
"\\\\"
PHP看到\\
,正则表达式引擎看到\
函数preg_quote()
将通过为您转义所有正则表达式元字符来为您消除一层混乱。例如:
$foo = preg_quote("c:\\some\\path\\or_whatever");
preg_match("/$foo/", $bar);
您似乎将此视为&{34} \\
&#34;的单位,这似乎并不能准确描述正在发生的事情。为了更好的例子,让我们使用一个在PHP和正则表达式中都很重要的不同字符$
。
$
"\$"
,PHP看到的文字字符串为$
$
:"\\\$"
,PHP看到文字字符串\$
,正则表达式看到文字字符串$
用不同风格的括号表示,表示不同的转义级别:
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)
因为反斜杠是一个特殊字符,所以需要将其转义两次。所以\\为第一个反斜杠,\\为第二个反斜杠。