2014-09-23 302 views
3

在尋找幫助清理某些輸出的解決方案的過程中,我遇到了執行以下操作的代碼。\ x80 - \ xFF指的是什麼?

preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $some_url) 

現在,我認爲它基本上是試圖刪除除上述字符以外的任何東西。但是\\x80-\\xff是不是指某種形式的不可打印的ascii字符?如果是這樣,爲什麼代碼可能會試圖不刪除它們?

任何跡象/指針/幫助將不勝感激。謝謝。

回答

4

好的,到目前爲止給出的所有答案都使我朝着正確的方向發展,並允許我在documentation中找到以下內容。

在\ x之後,最多讀取兩個十六進制數字(字母可以是 大寫或小寫)。在UTF-8模式下,允許\ x {...},其中大括號的內容是一串十六進制數字。它是 解釋爲一個UTF-8字符,其代碼號是給定的 十六進制數字。原始十六進制轉義序列,\ XHH, 兩個字節的UTF-8字符匹配如果該值大於127

所以,作爲一個總結: -

ⅰ) '\ X'允許十六進制轉義序列,在此之後,最多兩個十六進制數字被讀

II)「\ XHH」兩個「HH」字母可以是大寫或小寫

ⅲ)「\ XHH」指定範圍內的代碼點0-FF

iv)'\ x80- \ xFF'是指ASCII之外的字符範圍

1

您不需要在PHP模式下使用雙反斜槓,但即使使用它,它也會被忽略並作爲轉義讀取(如簡單的反斜槓)。

一個例外,如果您使用heredoc或nowdoc語法來封閉模式,則雙反斜槓將被視爲文字反斜槓。

2

x80 - xFF是非ASCII字符範圍。它們仍然可打印,無論是Latin-1還是UTF-8編碼更高的代碼點。使用\\x80而不是\x80稍微更正確。反斜槓在字符串中轉義。在單引號字符串中,雖然它在那裏實際上是不相關的。

在雙引號字符串中,只使用\x80將被PHP解釋,而\\x80將被正則表達式引擎查看和解釋。

+0

謝謝您花時間回答。我瞭解你答案的第一部分。但是...... 「在雙引號字符串中,只使用\ x80將被PHP解釋,而\\ x80將被正則表達式引擎查看和解釋。」 ...失去了我。此外,不應該雙反斜槓最終逃避反斜槓本身,迫使它被視爲一個單獨的字符...並將X80和XFF單獨對待,沒有任何反斜槓? – Grateful 2014-09-23 05:16:18

+0

重新閱讀答案之後,我還想問一下,沒有任何反斜槓的'| x80 - xFF | i'是否與上述內容一樣是有效的語法。 – Grateful 2014-09-23 05:24:13

+0

不,它不會。閱讀關於反斜槓的[PHP字符串](http://php.net/string#language.types.string.syntax.double)。 – mario 2014-09-23 06:07:45