2个PHP系统上的不同正则表达式输出?

时间:2014-04-23 13:37:07

标签: php regex unicode

鉴于此测试脚本:

<?php

echo setlocale(LC_ALL, '') . "\n";

$in = 'Città';

$var = preg_replace('/\s+$/', '', $in);

echo bin2hex($in) . "\n";
echo bin2hex($var) . "\n";

在Ubuntu上的PHP 5.5.3,我得到:

en_GB.UTF-8
43697474c3a0
43697474c3a0

Mac上的PHP 5.5.9(通过Macports)

en_GB.UTF-8
43697474c3a0
43697474c3

为什么Macports版本会以不同的方式处理à字符?

我知道c3a0,当被视为ASCII中的两个字节时,Ã后跟一个不间断的空格。我想知道为什么一个系统将2个字节视为没有u修饰符的UTF-8。

1 个答案:

答案 0 :(得分:1)

使用/u modifier

  

u(PCRE_UTF8)此修饰符打开PCRE的其他功能   这与Perl不兼容。模式字符串被视为UTF-8。

默认情况下,该字符串被视为一个单字节字符序列;问题是你的一些字符在UTF-8中被编码为多字节。虽然0xc3a0是单个代码点,但\s将匹配其第二个字节0xa0,这是一个不间断的空格,因此是空格。

$var = preg_replace('/\s+$/u', '', $in);

应该启用UTF-8模式进行匹配,它应该适用于所有系统。