为什么\ w匹配Mac OS X PHP环境中的非英文字符?

时间:2016-03-09 08:59:35

标签: php regex

我发现“\ w”可以匹配Mac OS X PHP环境中的中文字符。但是相同的代码在Linux上不起作用。

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"
}

使用PHP 5.6.18(cli)的Cent OS 6,PHP 5.2.17p1(cli)结果

0
array(0) {
}

PHP手册说

  

字母和数字的定义由PCRE的字符表控制,如果发生特定于区域设置的匹配,则可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于128的字符代码用于重音字母,并且这些字符代码由\ w匹配。“

我想有些东西链接到PCRE库。有人可以解释为什么吗?

1 个答案:

答案 0 :(得分:0)

是的,这完全是关于PCRE如何与PHP一起编译的:

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

在此函数中,负责将RegExes编译为其内部形式,options参数是包含PCRE_UCP(UCP = Unicode字符属性)的位列表,允许\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等转义符   \w

     

但是,如果PCRE是使用Unicode属性支持构建的,则全部   字符可以使用\ p和\ P进行测试,或者使用   编译模式时可以设置PCRE_UCP选项; 这个原因   |和朋友使用Unicode属性支持代替   内置表格

     

不鼓励使用带有Unicode的语言环境。如果你是   处理代码点大于128的字符,你应该   要么使用Unicode支持,要么使用区域设置,但不要尝试混合使用   2。