php - 为什么这个正则表达式在 Ubuntu 上传递,但在 Mac OS X 上不传递

标签 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 上,这可以正确通过(打印 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/

相关文章:

php - 比较两个数据库之间获取的数据

php - 如何将 getimagesize() 与 $_FILES ['' ] 一起使用?

PHP 语法错误,我是瞎了吗?

PHP Spintax 处理器

java - 使用命名组捕获特定字符之前的所有内容

objective-c - 如何防止子进程在停靠栏中弹跳?

php - header() 不会自动重定向到另一个索引页

python - 开头的特殊字符与每个单词的结尾匹配[仅限正则表达式]

macos - 为 Mac 编译 OpenSSL 时出现 libcrypto ar 错误

macos - Mac OS X中的麦克风和扬声器是哪个/dev/...(设备)?