文字列からアクセントを削除する最も効率的な方法は何ですか? ÈâuÑ
はEaun
?になります
欠落している単純な方法、または正規表現がありますか?
Iconvがインストールされている場合は、これを試してください(入力文字列がUTF-8であると仮定しています):
echo iconv('UTF-8', 'ASCII//TRANSLIT', $string);
(iconvはあらゆる種類のエンコーディング間で変換するためのライブラリです。これは効率的で、多くのPHPディストリビューションにデフォルトで含まれています。何よりも、独自の解決策(「カール付きのラテン文字N」があることをご存知ですか? どちらでもない 。))
私のすべてのテストケースで機能する解決策を見つけました( 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
EDIT:このソリューションは、setlocale()を使用して設定されたロケールに依存しません。 iconv()に対するもう1つの利点は、非ラテン文字でさえ無視されないことです。
EDIT2:最初に投稿した音訳でカバーされない文字がいくつかあることを発見しました。 Any-Latin
はキリル文字を翻訳しますь
は、ラテン文字セットに収まらない文字に:ʹ
( http://en.wikipedia.org/wiki/Prime_%28symbol%29 )。私は追加しました [\u0100-\u7fff] remove
これらの非ラテン文字をすべて削除します。また、テキストにテストを追加しました;)
ここでLatin
によるラテン文字セットの1つではなく、ラテンアルファベットを意味することをお勧めします。しかし、とにかく-私の意見では、彼らはそれを何かASCII then Latin-ASCII
...
EDIT3:ここで別の変更を行って申し訳ありません。出力としてASCII文字のみを取得するために、文字をu0100ではなくu0080にする必要がありました。上記のテストは更新されました。
@palantirのリクエストに応じてこれを再投稿します...
Iconvは完全に信頼性が低く、preg_replaceソリューションと大きな配列は嫌いです...だから、私のお気に入りの方法(そして私が見つけた唯一の信頼できる方法)は...
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
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))
注:他の人に役立つことを期待して、別の同様の質問からこれを再投稿しています。
Iconv()が不完全すぎることがわかったため、PHPプロジェクトのURLify.jsに基づいてDjangoライブラリを作成することになりました。ここで見つけることができます:
https://github.com/jbroadway/urlify
ラテン文字、ギリシャ語、トルコ語、ロシア語、ウクライナ語、チェコ語、ポーランド語、ラトビア語を処理します。