我发现这个函数从UTF-8中的字符串中删除了diactrics,我不知道为什么它必须使用preg_match_all函数以及它的模式到底是做什么的?
function strtr_utf8($str)
{
$keys = array();
$values = array();
preg_match_all('/./u', 'ĘÓĄŚŁŻŹĆŃęóąśłżźćń', $keys);
preg_match_all('/./u', 'EOASLZZCNeoaslzzcn', $values);
$mapping = array_combine($keys[0], $values[0]);
return strtr($str, $mapping);
}
答案 0 :(得分:3)
这只是将字符串扩展为单字符数组
你得到2个字符数组,然后将它们组合成一个key=>value
对数组
反过来用于strtr
字符替换 - >奇怪的UTF8字符被ASCII替换。
为什么我们用preg_match_all()
将其爆炸?为什么要使用正则表达式?
我想,因为/u
键,它可以使用UTF8字符。如果使用普通的PHP字符串函数,例如str_split()
,它会在bytes
而不是characters
中爆炸它们,并且由于UTF8的多字节结构,它将是一团糟。比如,字母Å
在UTF8字符串中占用2个字节。
基本上,你得到的是:
$mapping = ['Ę' => 'E', 'Ó' => 'Q', 'Ą' => 'A', ... 'ń' => 'n'];
您还可以使用多字节字符串库函数,如下所示:
str_replace(mb_str_split($from), mb_str_split($to), $str);
答案 1 :(得分:1)
另外,另一种可能的方法是做同样的事情:
$input = 'ĘÓĄŚŁŻŹĆŃęóąśłżźćń';
setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
print_r($result);