为什么这个正则表达式传递给Ubuntu而不是Mac OS X.

时间:2014-03-11 09:29:06

标签: php regex macos ubuntu ascii

这是一个简短的函数,用于针对仅匹配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=

1 个答案:

答案 0 :(得分:1)

这可能是由两个操作系统的语言环境之间的差异引起的。

来自O'Reilly的编程PHP:

  

特别是,构成“字母”的内容因语言而异(想想à和ç),并且POSIX正则表达式中有字符类将此考虑在内。

     

...

     

POSIX定义了许多可在字符类中使用的命名字符集。 [...]实际字母因地区而异。

http://docstore.mik.ua/orelly/webprog/php/ch04_09.htm