奇怪的PHP UTF-8行为

时间:2010-11-11 11:53:29

标签: php linux apache utf-8 preg-replace

我有以下测试PHP代码:

header('Content-type: text/html; charset=utf-8');

$text = 'Développeur Web';
var_dump($text);

$text = preg_replace('#[^\\pL\d]+#u', '-', $text);
var_dump($text);

$text = trim($text, '-');
var_dump($text);

$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
var_dump($text);

$text = strtolower($text);
var_dump($text);

$text = preg_replace('#[^-\w]+#', '', $text);
var_dump($text);

在我的本地计算机上,它按预期工作:

string(16) "Développeur Web" 
string(16) "Développeur-Web" 
string(16) "Développeur-Web" 
string(16) "D'eveloppeur-Web" 
string(16) "d'eveloppeur-web" 
string(15) "developpeur-web" 

但在我的直播服务器上,它表现得很奇怪:

string 'Développeur Web' (length=16)
string '-pp-' (length=4)
string 'pp' (length=2)
string 'pp' (length=2)
string 'pp' (length=2)
string 'pp' (length=2)

本地机器是运行PHP版本5.2.4的Windows,而实时服务器是运行PHP版本5.2.10的CentOS,所以它们不相同,我知道并不理想。

有没有人经历过类似的事情,能指出我正确的方向吗?我假设它是某种与UTF-8或语言环境相关的服务器或PHP配置。

非常感谢提前

1 个答案:

答案 0 :(得分:2)

不应该是

$text = preg_replace('#[^\pL\d]+#u', '-', $text);
第6行中的

。如果您逃离\,您的排除类中将有一个文字\。因此,正则表达式[^\\pL\d]+会发现一个或多个字符不是\pL或数字。这可以解释为什么"Développeur Web"将缩减为"-pp-" - 所有内容都会在第一个p匹配时被替换为-;第二个p后的所有内容都是如此。

也许两台机器之间在如何处理转义\方面存在差异。

OP评论后

编辑

实际上转义\在这里没问题 - 两个版本的处理方式相同。实际上似乎问题是,所使用的PCRE版本不支持unicode属性,并且未使用--enable-unicode-properties进行编译。