我終於開始理解轉義十六進制字符背後的背景,如\x80
。該文檔討論escape sequences,但我也可以看到一些正則表達式使用雙反斜槓,如\\x80 - \\xFF
。雙轉義十六進制字符,例如\ x80 - \ xFF
當使用類似preg_replace的東西時,\\x80 - \\xFF
和\x80 - \xFF
之間有什麼區別?
我終於開始理解轉義十六進制字符背後的背景,如\x80
。該文檔討論escape sequences,但我也可以看到一些正則表達式使用雙反斜槓,如\\x80 - \\xFF
。雙轉義十六進制字符,例如\ x80 - \ xFF
當使用類似preg_replace的東西時,\\x80 - \\xFF
和\x80 - \xFF
之間有什麼區別?
當使用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"
),也可以將所有內容都轉義兩次。
要寫十六進制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);
謝謝你的時間和精力,它幫助我達到了最終的答案。 – Grateful 2014-09-23 08:44:40
這也取決於你是否使用'''或'「'。 – hjpotter92 2014-09-23 06:49:22
@ hjpotter92感謝 – Grateful 2014-09-23 07:54:29