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

时间:2010-08-22 18:21:51

标签: php regex string ascii

从字符串中删除重音的最有效方法是什么? ÈâuÑ成为Eaun

是否有一种简单的,内置的方式,我缺少或正则表达式?

5 个答案:

答案 0 :(得分:52)

如果您安装了iconv,请尝试此操作(示例假设您的输入字符串为UTF-8):

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

(iconv是一个可以在各种编码之间进行转换的库;它是高效的,默认包含在许多PHP发行版中。最重要的是,它比试图推出自己的解决方案更容易,更容易出错(你知道吗?)有一个“拉丁字母N卷曲”?Me neither。))

答案 1 :(得分:45)

我找到了一个解决方案,适用于我的所有测试用例(从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

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

EDIT2:我发现有一些字符,我最初发布的音译没有涵盖这些字符。 Any-Latin将西里尔字符ь转换为不适合拉丁字符集的字符:ʹhttp://en.wikipedia.org/wiki/Prime_%28symbol%29)。我已添加[\u0100-\u7fff] remove以删除所有这些非拉丁字符。我还在文本中添加了一个测试;)

我建议,他们的意思是拉丁字母,而不是Latin这里的拉丁字符集之一。但无论如何 - 在我看来,他们应该将它音译为ASCII,然后在Latin-ASCII ...

EDIT3:对不起,此处有其他更改。我不得不将字符缩小到u0080而不是u0100,只能输入ASCII字符作为输出。上面的测试已更新。

答案 2 :(得分:20)

根据@palantir的请求重新发布...

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

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

答案 3 :(得分:13)

您可以使用iconv将字符音译为普通的US-ASCII,然后使用正则表达式删除非字母字符:

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

另一种方法是使用Normalizer标准化为Normalization Form KD (NFKD),然后删除标记字符:

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

答案 4 :(得分:12)

注意:我将这个问题从另一个类似的问题转发,希望对其他人有帮助。

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

https://github.com/jbroadway/urlify

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