「きれいなURL」を書き換えるときに発音区別符号(アクセント)を処理する方法

StackOverflow https://stackoverflow.com/questions/465990

  •  19-08-2019
  •  | 
  •  

質問

URLを書き換えて、ユーザーが作成した旅行ブログのタイトルを含めます。

これは、URLの読みやすさとSEOの目的の両方で行っています。

 http://www.example.com/gallery/280-Gorges_du_Todra/

最初の整数はidで、残りは私たち人間向けです(ただし、リソースのリクエストには関係ありません)。

今では、UTF-8文字を含むタイトルを書くことができますが、ほとんどはURLで許可されていません。 私の聴衆は一般的に英語を話しますが、旅行するので、彼らは

 Aït Ben Haddou

LinuxでPHPを使用してURLに表示するためにこれを翻訳する適切な方法は何ですか。

これまでのところ、いくつかの解決策を見てきました。

  1. 許可されていない文字をすべて削除し、スペースを置き換えます これには奇妙な結果があります:
    'Aït Ben Haddou' → /gallery/280-At_Ben_Haddou/
    あまり役に立たない。

  2. 許可されていない文字をすべて削除し、スペースを置き換え、文字コード(stackoverflow.com)を残します。これは、おそらく「regex-hammer」が使用されているためです
    これは奇妙な結果をもたらします: 'tést tést' → /questions/0000/t233st-t233st

  3. 「最も近い同等物」に翻訳
    'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
    しかし、これはドイツ人にとっては間違っています。たとえば、「<!>#252;」 「ue」と音訳する必要があります。

私にとって、オランダ人として、3番目の結果は最も「見える」。
ただし、(1)多くの人が異なる意見を持っていることと、(2)ドイツの例ではまったく間違っていることは間違いありません。

3番目のオプションのもう1つの問題は、7ビットの同等物に変換できるすべての可能な文字を見つける方法ですか?

質問は次のとおりです:

  1. あなたの意見では、最も望ましい結果は何ですか。 (技術制限内)

  2. それを技術的に解決する方法。 (目的の結果に到達する)PHPを使用します。

役に立ちましたか?

解決

最終的に、この問題については<!> quot; correct <!> quot;の考えをあきらめなければなりません。どうやって文字列を翻訳しても、互換性と可読性の名の正確さを損ないます。 3つのオプションはすべて同等に互換性がありますが、#1と#2は読みやすさの点で問題があります。したがって、それを実行して、最高に見えるものを探してください<!>#8212;オプション#3。

はい、ドイツ語の翻訳は間違っていますが、タイトルの言語を指定するようユーザーに要求し始めない限り(そして1つだけに制限する場合)、それ以上の努力なしにその問題を解決することはできません。それは価値があります。 (たとえば、タイトルの各単語を既知の各言語の辞書に通し、その単語の発音区別符号をその言語の規則に従って翻訳すると、動作しますが、それは過剰です。)

別の方法として、ドイツ語が他の言語よりも懸念される場合は、ドイツ語版が存在する場合は常に常に使用するようにします:ä <!>#8594; aeë <!>#8594; eï <!>#8594; iö <!>#8594; oeü <!>#8594; ue

編集:

ああ、実際の方法については、str_replaceを使用して特殊なケースがあればそれを翻訳し、残りにはiconvを使用します:

$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text);
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);

他のヒント

私にとって、3番目は最も読みやすいです。

小さな辞書を使用できます。 ï -> iおよびü -> ueを使用して、さまざまな文字の翻訳方法を指定します。

おもしろいサイドノートとして、IDの後には何も問題にならないようです。これはこのページへのリンクです:

「pretty」を書き換えるときに発音区別符号(アクセント)を処理する方法URL '

明らかに、リンクを壊すことなくタイトルの変更を許可することが動機であり、その機能も考慮することをお勧めします。

いいトピック、私は少し前に同じ問題を抱えていました。
修正方法は次のとおりです。

function title2url($string=null){
 // return if empty
 if(empty($string)) return false;

 // replace spaces by "-"
 // convert accents to html entities
 $string=htmlentities(utf8_decode(str_replace(' ', '-', $string)));

 // remove the accent from the letter
 $string=preg_replace(array('@&([a-zA-Z]){1,2}(acute|grave|circ|tilde|uml|ring|elig|zlig|slash|cedil|strok|lig){1};@', '@&[euro]{1};@'), array('${1}', 'E'), $string);

 // now, everything but alphanumeric and -_ can be removed
 // aso remove double dashes
 $string=preg_replace(array('@[^a-zA-Z0-9\-_]@', '@[\-]{2,}@'), array('', '-'), html_entity_decode($string));
}

私の機能の仕組みは次のとおりです。

  1. HTMLエンティティに変換する
  2. アクセントを取り除く
  3. 残りの奇妙な文字をすべて削除する
  

今では、UTF-8文字を含むタイトルを作成できますが、ほとんどはURLで許可されていません。

反対に、ほとんどは許可されています。たとえば、WikipediaのURL- http://en.wikipedia.org/wiki/のようなものを参照してください。 Caf <!>#233; (別名 http://en.wikipedia .org / wiki / Caf%C3%A9 )はうまく表示されます-StackOverflowの蛍光ペンがそれらを正しく選択しなくても:-)

トリックは、あらゆるホスティング環境で確実にそれらを読み取ることです。 CGIおよびWindowsサーバー、特にIISなどに問題があります。

これは良い機能です:

function friendlyURL($string) {
    setlocale(LC_CTYPE, 'en_US.UTF8');
    $string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
    $string = str_replace(' ', '-', $string);
    $string = preg_replace('/\\s+/', '-', $string);
    $string = strtolower($string);
    return $string;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top