我一直在寻找一篇关于何时需要双重转义、何时不需要双重转义的可靠文章,但我找不到任何东西。也许我看起来不够仔细,因为我确信在某个地方有一个解释,但让下一个有这个问题的人很容易找到!
以以下正则表达式模式为例:
/\n/
/domain\.com/
/myfeet \$ your feet/
没什么突破性的吧?好的,让我们在 PHP 的 preg_match 函数的上下文中使用这些示例:
$foo = preg_match("/\n/", $bar);
$foo = preg_match("/domain\.com/", $bar);
$foo = preg_match("/myfeet \$ your feet/", $bar);
据我了解,带引号的字符串值上下文中的反斜杠会转义后面的字符,并且表达式是通过带引号的字符串值给出的。
前面的操作是否会像执行以下操作一样,这不会导致错误吗?:
$foo = preg_match("/n/", $bar);
$foo = preg_match("/domain.com/", $bar);
$foo = preg_match("/myfeet $ your feet/", $bar);
哪个不是我想要的对吗?这些表达与上面不一样。
难道我不必像这样写双重转义吗?
$foo = preg_match("/\\n/", $bar);
$foo = preg_match("/domain\\.com/", $bar);
$foo = preg_match("/myfeet \\$ your feet/", $bar);
那么,当 PHP 处理字符串时,它会将反斜杠转义为反斜杠,然后在传递给 PCRE 解释器时保留该反斜杠吗?
或者 PHP 是否神奇地知道我想将反斜杠传递给 PCRE 解释器......我的意思是它怎么知道我不想这样做\"
转义我想在表达式中使用的引用?或者使用转义引号时只需要双斜杠?就此而言,您需要三次转义引号吗?\\\"
你知道吗,这样引号就会被转义并留下一个双精度?
这有什么经验法则?
我刚刚用PHP做了一个测试:
$bar = "asdfasdf a\"ONE\"sfda dsf adsf me & mine adsf asdf asfd ";
echo preg_match("/me \$ mine/", $bar);
echo "<br /><br />";
echo preg_match("/me \\$ mine/", $bar);
echo "<br /><br />";
echo preg_match("/a\"ONE\"/", $bar);
echo "<br /><br />";
echo preg_match("/a\\\"ONE\\\"/", $bar);
echo "<br /><br />";
Output:
0
1
1
1
因此,看起来对于引号来说并不重要,但是对于美元符号,正如我所想的那样,需要双重转义。