簡體   English   中英

如何正確地轉義反斜杠以匹配單引號和雙引號PHP正則表達式模式中的文字反斜杠

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM