奇怪的PHP UTF-8行为

Pet*_*ugh 6 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);
Run Code Online (Sandbox Code Playgroud)

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

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" 
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

提前谢谢了

Ste*_*rig 2

不应该是吗

\n\n
$text = preg_replace(\'#[^\\pL\\d]+#u\', \'-\', $text);\n
Run Code Online (Sandbox Code Playgroud)\n\n

在第 6 行中。如果您转义了,您的排除类中将\\有一个文字\\。因此,正则表达式会查找一个或多个不是、或数字[^\\\\pL\\d]+的字符。这可以解释为什么将减少为- 直到第一场比赛的所有内容并将被替换为; 第二个之后的所有事情也是如此。\\pL"D\xc3\xa9veloppeur Web""-pp-"p-p

\n\n

\\也许这两台机器在对待逃亡者的方式上存在差异。

\n\n

OP评论后编辑:

\n\n

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

\n