了解preg_match_all用法和正则表达式“/./u”模式


understanding preg_match_all use and regex '/./u' pattern

我发现这个函数可以从 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);