从字符串中删除重音的最有效方法是什么? ÈâuÑ
成为Eaun
?
是否有一种简单的,内置的方式,我缺少或正则表达式?
答案 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
处理拉丁字符以及希腊语,土耳其语,俄语,乌克兰语,捷克语,波兰语和拉脱维亚语。