我发现这个函数可以从 UTF-8 的字符串中删除变音符,我不知道为什么它必须使用 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);
}
这只是将字符串分解为一个字符数组。
你得到 2 个字符数组,然后将它们组合成一个key=>value
对数组。
这反过来又用于strtr
字符替换 ->奇怪的 UTF8 字符被替换为 ASCII 字符。
为什么我们用preg_match_all()
爆炸它?为什么要使用正则表达式?
我猜,因为/u
键,这使得它适用于 UTF8 字符。如果使用像str_split()
这样的普通PHP字符串函数,它会在bytes
而不是characters
中分解它们,并且由于UTF8的多字节结构,这将是一团糟。例如,字母 Å
在 UTF8 字符串中需要 2 个字节。
基本上,你得到的是:
$mapping = ['Ę' => 'E', 'Ó' => 'Q', 'Ą' => 'A', ... 'ń' => 'n'];
您还可以使用多字节字符串库函数,如下所示:
str_replace(mb_str_split($from), mb_str_split($to), $str);
顺便说一句,另一种可能的方法可以做同样的事情:
$input = 'ĘÓĄŚŁŻŹĆŃęóąśłżźćń';
setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
print_r($result);