PHP:用UTF-8stringreplace最接近的7位ASCII等效的元音变音
我想要做的是从string中删除所有的重音符号和变音符号,将“lärm”变成“andré”和“andre”。 我试图做的是utf8_decodestring,然后使用strtr,但由于我的源文件保存为UTF-8文件,我不能inputISO-8859-15字符的所有变音 – 编辑插入UTF-8字符。
很明显,解决scheme是包含一个ISO-8859-15文件,但是必须有一个更好的方法,而不是另外包含一个?
echo strtr(utf8_decode($input), 'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ', 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
更新:也许我有点不准确,我试图做的事情:我实际上并不想删除变音符号,而是用它们最接近的“单字符ASCII”replace它们。
iconv("utf-8","ascii//TRANSLIT",$input);
扩展示例
一个小窍门,不需要设置语言环境或有大量的翻译表:
function Unaccent($string) { if (strpos($string = htmlentities($string, ENT_QUOTES, 'UTF-8'), '&') !== false) { $string = html_entity_decode(preg_replace('~&([az]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $string), ENT_QUOTES, 'UTF-8'); } return $string; }
它正确工作的唯一要求是将文件保存为UTF-8格式(应该已经是这样了)。
你也可以试试这个
$string = "Fóø Bår"; $transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Lower(); :: NFC;', Transliterator::FORWARD); echo $normalized = $transliterator->transliterate($string);
好的,我自己find了一个明显的解决scheme,但这不是关于性能的最好方法。
echo strtr(utf8_decode($input), utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'), 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
对于阿拉伯语和波斯语用户,我推荐使用这种方式来删除变音符号:
$diacritics = array('َ','ِ','ً','ٌ','ٍ','ّ','ْ','ـ'); $search_txt = str_replace($diacritics, '', $diacritics);
为了在阿拉伯文键盘中input变音符,你可以使用这个Asci(这些代码是Asci不是Unicode)代码在Windows编辑器直接input符号或按住Alt +(input变音符号代码)这是代码
(0243)(0246)(0245)(0240)(0242)(0241)(0250)(0248)(0220)
我发现这个以法语和德语给出了最一致的结果。 与元标记设置为utf-8
,我已经把它放在一个函数,从一个单词的数组中返回一行,它的作品完美。
htmlentities ( $line, ENT_SUBSTITUTE , 'utf-8' )