web-dev-qa-db-ja.com

アクセントを削除して文字を「プレーン」に変換する方法ASCII文字?

文字列からアクセントを削除する最も効率的な方法は何ですか? ÈâuÑEaun?になります

欠落している単純な方法、または正規表現がありますか?

44
Mark Lalor

Iconvがインストールされている場合は、これを試してください(入力文字列がUTF-8であると仮定しています):

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

(iconvはあらゆる種類のエンコーディング間で変換するためのライブラリです。これは効率的で、多くのPHPディストリビューションにデフォルトで含まれています。何よりも、独自の解決策(「カール付きのラテン文字N」があることをご存知ですか? どちらでもない 。))

52
Piskvor

私のすべてのテストケースで機能する解決策を見つけました( 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にする必要がありました。上記のテストは更新されました。

48
SimonSimCity

@palantirのリクエストに応じてこれを再投稿します...

Iconvは完全に信頼性が低く、preg_replaceソリューションと大きな配列は嫌いです...だから、私のお気に入りの方法(そして私が見つけた唯一の信頼できる方法)は...

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

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))
13
Gumbo

注:他の人に役立つことを期待して、別の同様の質問からこれを再投稿しています。

Iconv()が不完全すぎることがわかったため、PHPプロジェクトのURLify.jsに基づいてDjangoライブラリを作成することになりました。ここで見つけることができます:

https://github.com/jbroadway/urlify

ラテン文字、ギリシャ語、トルコ語、ロシア語、ウクライナ語、チェコ語、ポーランド語、ラトビア語を処理します。

12
Johnny Broadway