【问题标题】:Why does this regex pass on Ubuntu but not on Mac OS X为什么这个正则表达式在 Ubuntu 上传递,但在 Mac OS X 上没有传递
【发布时间】:2014-03-11 09:29:06
【问题描述】:

这是一个简短的函数,旨在针对仅匹配 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"

正确通过的 Ubuntu 机器上的语言设置(返回 OK)是:

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=

【问题讨论】:

  • 我已经在 Mavericks 的 PHP 版本 5.3.28 和 5.4.25 上测试过,效果很好
  • 你用的是什么版本的PHP?
  • 您的 Ubuntu 和 OSX 安装是否可能使用不同的语言环境?如果是这样,当您更改其中一个并重试时会发生什么?
  • 我使用的是 PHP 5.5.5。将尝试更改语言环境,看看会发生什么。
  • 是的,字符串包含非 ascii 字符,因此脚本应始终输出“OK”(表示不匹配)。但是,我对 Mavericks 和 php 5.4 和 5.5 有相同的体验(模式匹配)。在 OSX 上运行 php > 5.3 可能是个问题,但我不明白为什么。

标签: php regex macos ubuntu ascii


【解决方案1】:

这可能是由于两个操作系统的区域设置不同造成的。

来自 O'Reilly 的 PHP 编程:

具体而言,“字母”的构成因语言而异(想想 à 和 ç),POSIX 正则表达式中的字符类考虑了这一点。

...

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

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

【讨论】:

    【解决方案2】:

    事实证明,:ascii: 表达式在整个安装过程中的评估方式不同(但我不确定它是在操作系统端,还是在 PHP 端,或 brew 端,还是在其他地方)。

    因此,在这种情况下,可以通过将 /^[[:ascii:]]*$/u 表达式替换为 /^[\x00-\x7F]*$/u 来解决此问题。完整的代码是:

    <?php
    $test = 'æhrzBGFX029!^%/\#,.';
    if (preg_match('/^[\x00-\x7F]*$/u', $test)) {
        echo 'ERR: this shouldn\'t have matched: \'' . $test . '\'';
    } else {
        echo 'OK';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多