了解preg_match_all使用和正则表达式'/./u'模式

时间:2015-02-03 14:24:56

标签: php regex

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

2 个答案:

答案 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);