我发现“\ 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库。有人可以解释为什么吗?
答案 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。