[英]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.