【问题标题】:preg_replace + UTF-8 doesn't work on one server but works on anotherpreg_replace + UTF-8 在一台服务器上不起作用,但在另一台服务器上起作用
【发布时间】:2012-04-21 06:36:05
【问题描述】:
echo preg_match("/\b(בדיקה|מילה)\b/iu", "זוהי בדיקה");

由于某种原因,此代码在我测试过的几台服务器上返回 1,但在一台特定服务器上返回 0。

PCRE 编译时支持 UTF-8 和 Unicode 属性。可能是什么问题?

【问题讨论】:

  • locale 来自此服务器?来自网络服务器的默认字符集?检查“firebug”标头编码的响应
  • @ZiTAL 和其他服务器一样:Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
  • 这是什么输出操作系统? print_r(mb_detect_order());
  • 确保文件使用 UTF8 编码,某些文件复制程序会更改编码。否则@ZiTAL 的提示,语言环境可能会起作用:php.net/manual/en/class.locale.php
  • @ZiTAL Array ( [0] => ASCII [1] => UTF-8 ) 在所有服务器上。还有其他想法吗?这真是令人沮丧。此外,该文件当然是用 UTF-8 编码的。

标签: php utf-8 preg-replace


【解决方案1】:

PHP 使用的 PCRE 版本可能存在差异。

PHP 和 PCRE 版本:http://php.net/pcre.installation

你应该使用 8.10+ (PHP 5.3.4+)

Version 8.10 25-Jun-2010:

  1. 添加 PCRE_UCP 以制作 \b、\d、\s、\w 和某些 POSIX 字符类 使用 Unicode 属性。 (*UCP) 在模式的开头可用于设置 这个选项。修改 pcretest 以添加 /W 来测试这个工具。添加 REG_UCP 使其可通过 POSIX 接口使用。

编辑: 刚刚做了一些测试,它在 PHP 5.3.10 上给出 1,在 PHP 5.3.2 和 PHP 5.3.3 上给出 0。

【讨论】:

    【解决方案2】:

    它可能取决于 PCRE 库的版本。为了使事情更加规范化,请尝试使用«UCP动词»:preg_match('/(*UCP)\b(בדיקה|מילה)\b/iu', 'זוהי בדיקה')

    它仍然需要 PCRE v8.10,自 5.3.4 起随 PHP 一起提供,或者在编译标志 --with-pcre-regex=DIR 中提及时。

    Ref (in russian)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 2015-09-30
      相关资源
      最近更新 更多