2014-09-23 75 views
0

我終於開始理解轉義十六進制字符背後的背景,如\x80。該文檔討論escape sequences,但我也可以看到一些正則表達式使用雙反斜槓,如\\x80 - \\xFF雙轉義十六進制字符,例如\ x80 - \ xFF

當使用類似preg_replace的東西時,\\x80 - \\xFF\x80 - \xFF之間有什麼區別?

+0

這也取決於你是否使用'''或'「'。 – hjpotter92 2014-09-23 06:49:22

+0

@ hjpotter92感謝 – Grateful 2014-09-23 07:54:29

回答

1

當使用preg_函數時,您的字符串被解析兩次 - 首先,通過php編譯器,然後通過PCRE引擎。所以,如果你有,例如:

preg_match("/\x80/"....) 

編譯器把它變成

preg_match("/�/"....) // let � be chr(80) 

並將到PCRE。當你有兩條斜線:

preg_match("/\\x80/"....) 

編譯器開啓串入

preg_match("/\x80/"....) 

,然後它是將其轉換爲文字字符的PCRE引擎。

它沒有在這種特殊情況下有差別,但考慮:

preg_match("/\x5B/"....) 

編譯之後

preg_match("/[/"....) 

和PCRE失敗,因爲懸掛元字符[的。現在,如果你逃避它編譯成

preg_match("/\x5B/"....) 

這使得PCRE快樂斜線

preg_match("/\\x5B/"....) 

,因爲它知道[應該從字面上理解。

php編譯你的字符串的方式取決於你使用的引號:double/single/heredocs/nowdocs。詳情請參閱docs。簡單的經驗法則是儘可能使用單引號,如果必須使用雙精度(用於可變插值),即使技術上沒有必要(例如"\\b$word\\b"),也可以將所有內容都轉義兩次。

+0

這個解釋肯定幫助了我。我希望我能已經接受了超過一個‘解決方案’,但我不能。因此,我必須「接受」以前的答案,這是一樣有用的。無論如何,欣賞, – Grateful 2014-09-23 08:01:18

+0

@Grateful:沒有概率,很高興聽到它的幫助! – georg 2014-09-23 08:06:12

+0

其實,重新讀你的答案似乎流下了更多對於我來說,這是一個非常重要的問題,所以我被迫回過頭來回答你的問題,乾杯。 – Grateful 2014-09-23 08:47:21

0

要寫十六進制x80,您使用\和那種方式你得到\x80
現在在PHP字符串\中轉義特殊字符。在串"$var" PHP會嘗試在字符串中插入變量$var(因爲字符串使用"。爲了逃避$你寫"\$var"和輸出將只是簡單的字符串$var
我們寫串\(如果它使用無論"或您使用相同的轉義字符\。所以它變成\\輸出\

如果你寫"\x80"你的輸出將是"x80"(沒有\)。比你跳出\與另一個\ =>"\\x80"輸出"\x80"

所以總結一切:
\x80是十六進制字符,並且當您在字符串中寫入它時,您會寫入\\x80

只是一些樂趣:

PHP輸出js函數,以提醒\x80

echo "function alertHex(){ 
    alert('\\\\x80 - \\\\xFF'); 
}"; 

爲什麼4×\?首先你逃脫PHP字符串得到alert('\\x80 - \\xFF'),你逃脫JS字符串得到\x80 - \xFF
同樣的,preg_replace:允許符號:\$a-z[]:百通:\\\$[a-z]\[\]; preg_replace('\\\\\$[a-z]\\[\\]', '', $str);

+0

謝謝你的時間和精力,它幫助我達到了最終的答案。 – Grateful 2014-09-23 08:44:40

相關問題