2016-03-09 64 views
4

我發現「\ w」可以匹配我的Mac OS X PHP環境中的中文字符。但相同的代碼不適用於Linux。爲什麼 w在Mac OS X PHP環境中與非英文字符匹配?

php -r "echo preg_match('/^\w+$/','人1234', \$m).chr(10); var_dump(\$m);" 

的Mac OS X 11.11.3用PHP 5.6.18(CLI),PHP 5.4.45(CLI)導致

1 
array(1) { 
    [0] => 
    string(7) "人1234" 
} 

美分OS 6用PHP 5.6.18(CLI),PHP 5.2.17p1(CLI)結果

0 
array(0) { 
} 

PHP手冊說

的字母和數字的定義由PCRE的字符表控制,並且如果特定於語言環境的匹配可能會有所不同。例如,在「fr」(法語)語言環境中,一些大於128的字符代碼用於重音字母,並且這些字符與\ w相匹配。「

我想鏈接到PCRE庫的東西。有人解釋爲什麼

+1

很明顯,有一些設置使得所有正則表達式都可以識別Unicode。 –

+0

使用'locale'命令查看編碼 – anonymous

+0

@anonymous locale是相同的,en_US.UTF-8 – obawan

回答

0

是的,這是所有關於PCRE是如何沿着PHP編譯:

pcre *pcre_compile(const char *pattern, 
     int options, 
     const char **errptr, 
     int *erroffset, 
     const unsigned char *tableptr); 

在此功能中,這是負責編制的正則表達式爲內部形式,options說法是位名單包括PCRE_UCP(UCP = Unicode字符屬性)whi ch允許\w,\d和其他標記使用unicode屬性,並且您的Mac OS X機器上的PHP PCRE似乎已在此標誌上編譯。

還有一個特殊修飾符(*UCP),即使您的PCRE未用PCRE_UCP標誌集編譯,您也可以即時使用,您可以在運行時啓用此類選項。

E.g. /(*UCP)\w+/也與unicode字符相匹配。 (See it online

PCRE website來自:

PCRE處理無殼匹配,並且確定字符 是否字母,數字,或任何通過參考一組表,通過 字符代碼點索引。

UTF-8模式下運行,或者在16位或32位庫,這 僅適用於具有代碼點字符小於256在默認情況下, 更高值代碼點永遠不會匹配逃逸如\w\d。但是,如果使用Unicode屬性支持構建PCRE,則可以使用\ p和\ P來測試所有 字符,或者,可以在編譯模式時設置PCRE_UCP選項;或者,可以在編譯模式時設置PCRE_UCP選項。 這導致 \w和朋友使用Unicode屬性支持,而不是 內置表

不鼓勵使用Unicode語言環境。如果你是 處理代碼點大於128的字符,則應該使用Unicode支持或使用區域設置,但不要嘗試混合使用 二者。