2013-03-29 32 views

回答

8

看起來,當你在PCRE正則表達式使用u修飾符像,PHP是除了PCRE_UCP標誌也設置爲PCRE_UTF8標誌,導致Unicode屬性被引入到\w和其他POSIX字符類,而不僅僅是默認的ASCII字符。從man page on PCRE

PCRE_UCP

此選項更改PCRE處理\ B,\ B,\ d,\ d,\ S,\ S,\ W, \ W的方式,以及一些POSIX字符類。默認情況下,只識別ASCII 字符,但如果設置了PCRE_UCP,則會使用Unicode屬性 來代替字符分類。

這是再confirmed in the PHP source code(366-372線),在這裏我們看到:

 case 'u': coptions |= PCRE_UTF8; 
/* In PCRE, by default, \d, \D, \s, \S, \w, and \W recognize only ASCII 
    characters, even in UTF-8 mode. However, this can be changed by setting 
    the PCRE_UCP option. */ 
#ifdef PCRE_UCP 
        coptions |= PCRE_UCP; 
#endif 

所以,從我上面連接的同一個男人頁面,你會看到,當PCRE_UCP設置中,字符類成爲:

\ d \即p {釹}匹配的任何字符(十進制數字)

\ S即\ p任何字符{Z} matche S,加HT,LF,FF,CR

\ W \即p {L}或\ p {N}匹配時,加下劃線

+0

完美的答案的任何字符。在php中打開u標誌就像在你的正則表達式的前面添加(* UCP)(* UTF8)。可悲的是,從PCRE 8.34開始,無法關閉PCRE_UCP內聯。我說「可悲」,因爲這會讓\ w運行速度變慢,按照PCRE手冊:「通過Unicode屬性匹配字符並不是很快,因爲PCRE必須執行多級表查找才能找到字符的屬性,這就是爲什麼傳統的轉義序列(如\ d和\ w)默認情況下不使用PCRE中的Unicode屬性,儘管您可以通過設置PCRE_UCP選項或通過(* UCP)啓動模式來實現這種轉換「 – zx81

+0

實際上,有一種解決方法爲了使UTF8沒有UCP:設置UTF8內聯,而不是使用u標誌。例如:「〜(* UTF8)\ w +〜」這確保unicode模式已打開,但\ w不匹配\ p {L} – zx81