除了已經很好的,如果矛盾的答案,只是一個補充。
PCRE庫的文檔一直聲明「範圍在字符值的整理順序中運行」。這有點模糊,但非常精確。
它指的是通過在PCRE內部字符表的字符的索引,其可被設置以匹配使用pcre_maketables
當前區域整理。該函數按照char值的順序構建表(tolower(i)
/toupper(i)
)
換句話說,它不按實際的文化排序順序(區域設置排序規則信息)進行排序。例如,雖然德語在詞典整理中將o與o相同,但ö的值使其在德語所使用的所有常用字符編碼(ISO-8859-x,unicode編碼等)中出現在z範圍外。在這種情況下,PCRE將根據該代碼值確定ö是否在[a-z]
範圍內,而不是任何實際的區域設置排序順序。
PHP大多複製PCRE's documentation逐字在their docs。但是,他們實際上已經努力將上述語句更改爲「範圍在ASCII對齊序列中操作」。至少自2004年以來,這種說法一直在文檔中。
儘管如此,但我不太確定它是否屬實。嗯,至少在所有情況下都不是這樣。
的一個調用PHP使得以pcre_maketables
...從PHP source:
#if HAVE_SETLOCALE
if (strcmp(locale, "C"))
tables = pcre_maketables();
#endif
換句話說,如果該PHP編譯環境有setlocale
和的(LC_CTYPE)語言環境未POSIX/C語言環境,運行時環境的POSIX/C語言環境的字符順序被使用。否則,默認PCRE表用於 - 其中產生(由pcre_maketables
)時PCRE編譯 - 基於編譯器的語言環境:
該函數建立了一組字符表的字符值小於256。可以將這些傳遞給pcre_compile()以覆蓋PCRE的內部內置表(當編譯PCRE時,由pcre_maketables()生成)。如果您使用的是非標準語言環境,則可能需要執行此操作。該函數產生一個指向表的指針。
而德國將不會在任何普通的字符編碼是[a-z]
不同,如果我們處理EBCDIC,例如,[a-z]
將包括±和〜。當然,EBCDIC是我能想到的一種字符編碼方式,它不會以不間斷的順序放置a-z和A-Z。
除非PCRE在使用EBCDIC(可能的話)時會有一些神奇的功能,儘管極其不可思議的是,除了最晦澀的PHP構建或運行時環境之外,您還會在其中包含變音器(使用您自己的,非常特殊的,您的可能,在EBCDIC的情況下,包括其他意想不到的字符。而對於其他範圍,「按ASCII順序整理」似乎並不完全準確。
ETA:我可以通過尋找菲利普·黑茲爾自己回答了類似的擔憂已經存了一些研究:
另一個問題是與字符類範圍。你會認爲[a-k]和[x-z]對於拉丁腳本是很好的定義,但事實並非如此。
他們肯定明確的,等同於[\ x61- \ X6B]和[\ x78- \ X7A],也就是涉及到代碼順序,而不是文化的排序順序。
這是真的在2009年嗎? – 2014-04-02 06:18:38
@WalterTross今天仍然如此,真是如此。它從來不是關於什麼是/是常見的,而是關於一些奇怪的配置會發生什麼,並確保您的代碼足夠健壯以處理它。 – 2014-04-02 07:36:37
@AlanStorm,你能提供這麼奇怪的配置嗎?我很確定沒有! – 2014-04-02 08:30:03