PHP:用UTF-8字符串中最接近7位ASCII等效的变音符号替换

Bla*_*laM 44 php utf-8 diacritics strtr

我想要做的是从字符串中删除所有重音符号和变音符号,将"lärm"变为"larm"或将"andré"变为"andre".我试图做的是utf8_decode字符串,然后使用strtr,但由于我的源文件保存为UTF-8文件,我不能输入所有变音符号的ISO-8859-15字符 - 编辑器插入UTF-8字符.

显然,一个解决方案是拥有一个ISO-8859-15文件的包含,但必须有一个更好的方法,而不是另一个必需的包含?

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

更新:也许我尝试做的事情有点不准确:我实际上并不想删除变音符号,而是将它们替换为最接近的"单字符ASCII"等价物.

Vin*_*vic 53

iconv("utf-8","ascii//TRANSLIT",$input);
Run Code Online (Sandbox Code Playgroud)

扩展示例

  • 为什么这个解决方案在我的机器和[php reference](http://www.php.net/manual/en/function.iconv.php#105507)中的示例中返回`o`的`o`返回`oe`? (9认同)
  • 我不得不添加"setlocale(LC_ALL,'en_US');" (遗憾的是,我的机器上似乎没有德国本地人可用:(),但它确实有效.太棒了!:) (4认同)
  • 这对西里尔字符不起作用.他们被转换成?而是问号. (4认同)
  • 这个炸弹的价值是假的,并且让我注意到遇到了非法角色...... (2认同)
  • 对于spikey 的评论:如果您将语言环境设置为de_*.UTF8(de_DE.UTF8、de_CH.UTF8 等),那么元音变音将被转换为*e(ü->ue)。将其设置为 en_US..UTF8 以获得所需的效果。 (2认同)

Ali*_*xel 27

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

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;
}
Run Code Online (Sandbox Code Playgroud)

它正常工作的唯一要求是将文件保存为UTF-8(您应该已经存在).


gab*_*abo 5

你也可以试试这个

$string = "Fóø Bår";
$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD);
echo $normalized = $transliterator->transliterate($string);
Run Code Online (Sandbox Code Playgroud)

但你需要有http://php.net/manual/en/book.intl.php可用