如何删除重音符号并将字母转换为“普通”ASCII字符?

从string中删除重音符号的最有效的方法是什么?例如,变成Eaun

有一个简单的,内置的方式,我失踪或正则expression式?

如果你已经安装了iconv,试试这个例子(假设你的inputstring是UTF-8):

 echo iconv('UTF-8', 'ASCII//TRANSLIT', $string); 

(iconv是一个在各种编码之间进行转换的库;它的效率很高,默认情况下包含在许多PHP发行版中,最重要的是,比试图推出自己的解决scheme更容易,更具有错误性(你知道有一个“拉丁字母Ncurl”? 我也没有 。))

我find了一个解决scheme,在我的所有testing用例中都有效(从http://php.net/manual/en/transliterator.transliterate.php复制):;

 var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0080-\u7fff] remove', "A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi ¦")); // string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi " 

请参阅: http : //www.php.net/normalizer

编辑:此解决scheme是独立于使用setlocale()设置的区域设置。 iconv()的另一个好处是,即使是非拉丁字符也不会被忽略。

编辑2:我发现,有一些字符,不包括我原来发布的音译。 Any-Latin将西里尔文字符转换为不适合拉丁字符集的字符: ʹhttp://en.wikipedia.org/wiki/Prime_%28symbol%29 )。 我已经添加了[\u0100-\u7fff] remove删除所有这些非拉丁字符。 我也加了一个testing的文字;)

我build议,他们的意思是拉丁字母,而不是Latin集。 但是无论如何 – 在我看来,他们应该把它译成ASCII码,然后用Latin-ASCII

编辑3:对不起,在这里另一个改变。 我不得不把字符代替u0100,以获得只有ASCII字符作为输出。 上面的testing更新。

根据@palantir的要求重新发布这个…

我发现iconv完全不可靠,我不喜欢preg_replace解决scheme和大数组…所以我最喜欢的方式(以及我发现的唯一可靠的方法)是…

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

您可以使用iconv将字符音译为简单的US-ASCII,然后使用正则expression式删除非字母字符:

 preg_replace('/[^az]/i', '', iconv("UTF-8", "US-ASCII//TRANSLIT", $text)) 

另一种方法是使用Normalizer归一化到标准化表格KD(NFKD) ,然后删除标记字符:

 preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD)) 

注意:我从另一个类似的问题转贴这个,希望对别人有所帮助。

我最终编写了一个基于Django项目中的URLify.js的PHP库,因为我发现iconv()太不完整。 你可以在这里find它:

https://github.com/jbroadway/urlify

处理拉丁文字符以及希腊文,土耳其文,俄文,乌克兰文,捷克文,波兰文和拉脱维亚文。