PHP:将元音变音符替换为 UTF-8 字符串中最接近的 7 位 ASCII 等效项

2022-08-30 10:30:00

我想做的是去掉绳子上的所有重音符号和元音变音符号,把“lärm”变成“larm”或“andré”变成“andre”。我试图做的是utf8_decode字符串,然后在其上使用strtr,但是由于我的源文件被保存为UTF-8文件,我无法为所有元音变音符输入ISO-8859-15字符 - 编辑器插入UTF-8字符。

显然,解决这个问题的方法是有一个包含,这是一个ISO-8859-15文件,但一定有一个比另一个必需的包含更好的方法?

echo strtr(utf8_decode($input), 
           'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ',
           'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');

更新:也许我对我试图做的事情有点不准确:我实际上并不想删除元音变音符,而是用最接近的“一个字符ASCII”等效物替换它们。


答案 1
iconv("utf-8","ascii//TRANSLIT",$input);

扩展示例


答案 2

一个不需要设置区域设置或拥有大型转换表的小技巧:

function Unaccent($string)
{
    if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false)
    {
        $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8');
    }

    return $string;
}

它正常工作的唯一要求是将文件保存在UTF-8中(您应该已经这样做了)。


推荐