这是一个简短的函数,用于针对仅匹配ascii字符的正则表达式测试字符串:
<?php
$test = 'æhrzBGFX029!^%/\#,.';
if (preg_match('/^[[:ascii:]]*$/u', $test)) {
echo 'ERR: this shouldn\'t have matched: \'' . $test . '\'';
} else {
echo 'OK';
}
在Ubuntu上,这正确传递(确定打印)。但是在Mac OS X(Mavericks)上,这会返回错误响应( ERR:这不应该匹配)。
我无法弄清楚为什么会这样。有什么想法吗?
编辑:OS X区域设置为:
LANG="en_US"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
正确传递的Ubuntu框上的语言设置(返回确定)是:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
答案 0 :(得分:1)
这可能是由两个操作系统的语言环境之间的差异引起的。
来自O'Reilly的编程PHP:
特别是,构成“字母”的内容因语言而异(想想à和ç),并且POSIX正则表达式中有字符类将此考虑在内。
...
POSIX定义了许多可在字符类中使用的命名字符集。 [...]实际字母因地区而异。