[英]How to properly escape a backslash to match a literal backslash in single-quoted and double-quoted PHP regex patterns
为了匹配字面反斜杠,很多人和PHP手册都说:总是三重逃避它,就像这个\\\\\\\\
注意 :
单引号和双引号PHP字符串具有反斜杠的特殊含义。 因此,如果\\必须与正则表达式
\\\\
匹配,则必须在PHP代码中使用"\\\\\\\\"
或'\\\\\\\\'
。
这是一个示例字符串: \\test
$test = "\\test"; // outputs \test;
// WON'T WORK: pattern in double-quotes double-escaped backslash
#echo preg_replace("~\\\t~", '', $test); #output -> \test
// WORKS: pattern in double-quotes with triple-escaped backslash
#echo preg_replace("~\\\\t~", '', $test); #output -> est
// WORKS: pattern in single-quotes with double-escaped backslash
#echo preg_replace('~\\\t~', '', $test); #output -> est
// WORKS: pattern in double-quotes with double-escaped backslash inside a character class
#echo preg_replace("~[\\\]t~", '', $test); #output -> est
// WORKS: pattern in single-quotes with double-escaped backslash inside a character class
#echo preg_replace('~[\\\]t~', '', $test); #output -> est
结论 :
\\\\\\
以匹配文字\\ \\\\\\
在字符类之外它必须是三重转义\\\\\\\\
谁可以向我展示一个区别,单引号模式中的双重反斜杠,例如'~\\\\\\~'
将匹配任何不同于双引号模式中的三重反斜杠,例如"~\\\\\\\\~"
或失败。
何时/为什么/在什么情况下使用单引号模式中的双重转义\\
是错误的,例如'~\\\\\\~'
来匹配文字反斜杠?
如果对这个问题没有答案,我会继续在单引号的PHP正则表达式模式中使用双重转义反斜杠\\\\\\
来匹配文字\\
因为它可能没有任何问题。
PHP的解析器和正则表达式引擎(PCRE)都将反斜杠字符( \\
)视为转义字符。 如果您编写一个反斜杠字符,它将被PHP解析器视为转义字符。 如果你写两个反斜杠,它将被PHP的解析器解释为文字反斜杠。 但是当在正则表达式中使用时,正则表达式引擎会将其作为转义字符进行选择。 为避免这种情况,您需要编写四个反斜杠字符,具体取决于您引用模式的方式。
要理解两种类型的引用模式之间的区别,请考虑以下两个var_dump()
语句:
var_dump('~\\\~');
var_dump("~\\\\~");
输出:
string(4) "~\\~"
string(4) "~\\~"
转义序列\\~
在PHP没有特殊意义,当它在一个单引号字符串的二手。 三个反斜杠也可以工作,因为PHP解析器不知道转义序列\\~
。 所以\\\\
将成为\\
但是\\~
将保持为\\~
。
你应该使用哪一个:
为清楚起见,当我想匹配文字反斜杠时,我总是使用~\\\\\\\\~
。 另一个也有效,但我认为~\\\\\\\\~
更清楚。
在PHP中单引号或双引号字符串中实际转义斜杠之间没有区别 - 只要你做正确的话。 你在第一个例子中获得WONT WORK的原因是,正如评论中指出的那样,它会扩展到选项卡元字符。
当你只使用三个反斜杠时,单引号字符串中的最后一个将被解释为\\〜,就单引号字符串而言,它将保持不变(因为它与有效的转义序列不匹配) 。 然而,巧合的是,在这种情况下,这将按照您的预期进行解析,而不会产生某种副作用(即,\\\\\\'的行为方式不同)。
所有转义的原因是正则表达式还需要在某些情况下转义的反斜杠,因为它们在那里也有特殊含义。 这会导致相互之后出现大量的反斜杠,例如\\\\\\\\(它为markdown解析器提供了8个反斜杠,因为它再次增加了另一个转义级别)。
希望能够清除它,因为你似乎对单/双引号字符串中反斜杠的处理比正则表达式本身的行为更加困惑(无论“或”都是相同的,只要你逃避事物正确)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.