【问题标题】:PHP PCRE differences on testing and hosting serversPHP PCRE 在测试和托管服务器上的差异
【发布时间】:2011-02-11 15:18:29
【问题描述】:

我的以下正则表达式在我的测试服务器上运行良好,但在我的托管服务器上只返回一个空字符串。

$text = preg_replace('~[^\\pL\d]+~u', $use, $text);

现在我很确定这归结为 PCRE 的托管服务器版本未在启用 Unicode 属性支持的情况下进行编译。两个版本的区别如下:

我的服务器:

PCRE version 7.8 2008-09-05
Compiled with
UTF-8 support
Unicode properties support
Newline sequence is LF
\R matches all Unicode newlines
Internal link size = 2
POSIX malloc threshold = 10
Default match limit = 10000000
Default recursion depth limit = 10000000
Match recursion uses stack

托管服务器:

PCRE version 4.5 01-December-2003
Compiled with
UTF-8 support
Newline character is LF
Internal link size = 2
POSIX malloc threshold = 10
Default match limit = 10000000
Match recursion uses stack

另请注意,托管服务器上的版本(与 PHP 编译的版本相同)相当旧。

但让我感到困惑的是,pcretest 在命令行中的两台服务器上都失败了

re> ~[^\\pL\d]+~u
** Unknown option 'u'

虽然这个正则表达式在我的服务器上从 PHP 运行时可以正常工作。

所以,我想我的问题是由于缺少 Unicode 属性,托管服务器上的正则表达式是否会失败?还是我还缺少其他东西?

谢谢大家, 天然气。

【问题讨论】:

    标签: php regex unicode pcre


    【解决方案1】:

    很可能主机服务器上的 PCRE 没有启用 UTF8 支持。

    pcretest 使用不同的选项。 UTF-8 是 '8',而不是 'u'。这就是错误的原因。

    另请注意,不同的 PCRE 库可以在同一台机器上的 Apache 或 CLI 版本的 PHP 中使用。

    【讨论】:

      【解决方案2】:

      回答您的问题;是的,没有。我相信 PCRE 5.0 是提供 UTF8 支持时的门槛。

      【讨论】:

        【解决方案3】:

        PCRE 4.5 确实支持 UTF-8,但不支持 Unicode 属性,例如 \pL,也不支持启用它们的 /u 标志。您需要将服务器上的 PCRE 升级到 5.0 或更高版本。您可能还需要升级 PHP 以支持 preg_replace() 中的 /u

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-04
          • 2020-03-11
          • 2021-05-20
          • 2014-11-01
          • 1970-01-01
          • 2011-12-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多