这是一个简短的函数,旨在针对仅匹配 ascii 字符的正则表达式测试字符串:
<?php
$test = 'æhrzBGFX029!^%/\#,.';
if (preg_match('/^[[:ascii:]]*$/u', $test)) {
echo 'ERR: this shouldn\'t have matched: \'' . $test . '\'';
} else {
echo 'OK';
}
在 Ubuntu 上,这可以正确通过(打印 OK)。但是在 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"
正确通过(返回 OK)的 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=
最佳答案
这可能是由于两个操作系统的区域设置不同造成的。
来自 O'Reilly 的 PHP 编程:
In particular, what constitutes a "letter" varies from language to language (think of à and ç), and there are character classes in POSIX regular expressions that take this into account.
...
POSIX defines a number of named sets of characters that you can use in character classes. [...] The actual letters vary from locale to locale.
http://docstore.mik.ua/orelly/webprog/php/ch04_09.htm
关于php - 为什么这个正则表达式在 Ubuntu 上传递,但在 Mac OS X 上不传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22321481/