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配置.
提前谢谢了
不应该是吗
\n\n$text = preg_replace(\'#[^\\pL\\d]+#u\', \'-\', $text);\nRun Code Online (Sandbox Code Playgroud)\n\n在第 6 行中。如果您转义了,您的排除类中将\\有一个文字\\。因此,正则表达式会查找一个或多个不是、或数字[^\\\\pL\\d]+的字符。这可以解释为什么将减少为- 直到第一场比赛的所有内容并将被替换为; 第二个之后的所有事情也是如此。\\pL"D\xc3\xa9veloppeur Web""-pp-"p-p
\\也许这两台机器在对待逃亡者的方式上存在差异。
OP评论后编辑:
\n\n实际上,在这里转义\\是没有问题的 - 两个版本的处理方式相同。实际上问题似乎在于,所使用的 PCRE 版本不支持 unicode 属性,并且不是使用--enable-unicode-properties.