如何最有效地从字符串中去除重音符号,例如 ÈâuÑ
变为 Eaun
?
是否有一种简单的内置方法或正则表达式可以实现这个功能?
如何最有效地从字符串中去除重音符号,例如 ÈâuÑ
变为 Eaun
?
是否有一种简单的内置方法或正则表达式可以实现这个功能?
我找到了一个解决方案,这个方案在我所有的测试用例中都有效(从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() 相比的另一个好处是,即使非拉丁字符也不会被忽略。
编辑2: 我发现,一些字符并没有被我最初发布的音译方式所覆盖。 Any-Latin
将西里尔字母 ь
翻译为一个不适合于拉丁字符集的字符:ʹ
(http://en.wikipedia.org/wiki/Prime_%28symbol%29)。我添加了 [\u0100-\u7fff] remove
来删除所有这些非拉丁字符。我还在文本中添加了一个测试 ;)
我建议,他们在这里所提到的“Latin”指的是拉丁字母表,而不是拉丁字符集之一。但无论如何 - 在我看来,他们应该将其转换为某些 ASCII 字符,然后使用 Latin-ASCII
...
编辑3: 对于此处的更改再次表示抱歉。我不得不将字符降至 u0080 而不是 u0100,以获得仅 ASCII 字符作为输出。上面的测试已更新。
php_intl.dll
扩展被启用。 - Oriolecho iconv('UTF-8', 'ASCII//TRANSLIT', $string);
iconv是一种库,用于在各种编码之间进行转换;它高效且默认情况下包含在许多PHP发行版中。最重要的是,它绝对比尝试自己制作解决方案更容易且更可靠(你知道有一个“带卷曲的拉丁字母N”吗?我也不知道)。
应 @palantir 的请求重新发布此问题...
我发现iconv非常不可靠,而我也不喜欢使用preg_replace解决方案和大型数组...因此,在所有方法中,我最喜欢的方式(也是我找到的唯一可靠的方法)是...
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
ő
,Ő
,ű
,Ű
。谢谢 :) - Sk8erPeterŻŹĆŃĄŚŁĘÓżźćńąśłęó
)无效。尝试 var_dump(strtr(utf8_decode('qqqqŻŹĆŃĄŚŁĘÓżźćńąśłęóqqq'), utf8_decode('ŻŹĆŃĄŚŁĘÓżźćńąśłęó'),'ZZCNASLEOzzcnasleo'));
我得到了 string(25) "qqqqeeeeeeeeOeeeeeeeeoqqq"
。使用 iconv 更加可靠,例如 var_dump(iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'qqqqŻŹĆŃĄŚŁĘÓżźćńąśłęóqqq'));
,我得到了 string(25) "qqqqZZCNASLEOzzcnasleoqqq"
。 - piotrekkriconv
将字符转换为普通的US-ASCII,然后使用正则表达式删除非字母字符:preg_replace('/[^a-z]/i', '', iconv("UTF-8", "US-ASCII//TRANSLIT", $text))
另一种方法是使用Normalizer来将文本规范化为规范化形式KD(NFKD),然后删除标记字符:
preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD))
iconv
轉寫 ÈâuÑ
得到 \
E^au~N`。這就是為什麼要使用以下清理的原因。 - Gumbo