2016-03-09 40 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支持或使用区域设置,但不要尝试混合使用 二者。