【发布时间】:2010-11-11 11:53:28
【问题描述】:
我有以下测试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 配置。
在此先感谢
【问题讨论】:
-
奇怪。我不擅长正则表达式 - 你能详细说明第一个 preg_replace() 正在做什么吗?
-
我最初想到的是
mb_default_encoding(),但该库与preg_*函数无关。 -
第一个正则表达式应该用“-”替换非字母或数字,它来自 Symfony 教程symfony-project.org/jobeet/1_4/Doctrine/en/08
-
@Pekka:我认为正则表达式旨在用
-替换不是数字或不是Unicode 属性L的字符(即Letter)的每个字符.见de2.php.net/manual/en/regexp.reference.unicode.php -
@Stefan 干杯!那是我缺少的部分。在这种情况下,值得检查是否如手册所述,
PCRE is compiled with "--enable-unicode-properties"(如果不是,则应该有错误消息)。
标签: php linux apache utf-8 preg-replace