我发现“ \ w”可以在Mac OS X PHP环境中匹配汉字。但是相同的代码在Linux上不起作用。
php -r "echo preg_match('/^\w+$/','人1234', \$m).chr(10); var_dump(\$m);"
带有PHP 5.6.18(CLI),PHP 5.4.45(CLI)的Mac OS X 11.11.3
1
array(1) {
[0] =>
string(7) "人1234"
}
使用PHP 5.6.18(CLI),PHP 5.2.17P1(CLI)的Cent OS 6
0
array(0) {
}
PHP手册说
字母和数字的定义由PCRE的字符表控制,如果进行区域特定的匹配,则可能会有所不同。例如,在“ fr”(法语)语言环境中,某些大于128的字符代码用于带重音的字母,并且这些字符由\ w匹配。”
我猜有些链接到PCRE库。有人可以解释为什么吗?
是的,这一切都是关于如何与PHP一起编译PCRE:
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
标志集进行编译,也可以在运行时启用此选项。
例如,也/(*UCP)\w+/
匹配unicode字符。(在线观看)
从PCRE网站:
PCRE处理无大小写的匹配,并通过参考由字符代码点索引的一组表来确定字符是字母,数字还是其他字符。
在
UTF-8
模式下或在16位或32位库中运行时,这仅适用于代码点小于256的字符。默认情况下,高值代码点永远不会与转义符(例如\w
或)匹配\d
。但是,如果PCRE是使用Unicode属性支持构建的,则可以使用\ p和\ P来测试所有字符,或者,可以在编译模式时设置PCRE_UCP选项;否则,请参见图9。这会导致
\w
和朋友使用Unicode属性支持而不是内置表。不建议在Unicode中使用语言环境。如果要处理代码点大于128的字符,则应使用Unicode支持或使用语言环境,但不要尝试将两者混用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句