我有以下测试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配置。
非常感谢提前
答案 0 :(得分:2)
不应该是
$text = preg_replace('#[^\pL\d]+#u', '-', $text);
第6行中的。如果您逃离\
,您的排除类中将有一个文字\
。因此,正则表达式[^\\pL\d]+
会发现一个或多个字符不是\
,p
,L
或数字。这可以解释为什么"Développeur Web"
将缩减为"-pp-"
- 所有内容都会在第一个p
匹配时被替换为-
;第二个p
后的所有内容都是如此。
也许两台机器之间在如何处理转义 \
方面存在差异。
编辑:
实际上转义\
在这里没问题 - 两个版本的处理方式相同。实际上似乎问题是,所使用的PCRE版本不支持unicode属性,并且未使用--enable-unicode-properties
进行编译。