19

ユーザーが作成したトラベルブログのタイトルを含むようにURLを書き直します。

私はURLの読みやすさとSEOの目的の両方のためにこれを行います。

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

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

現在、人々は任意のUTF-8文字を含むタイトルを書くことができますが、ほとんどはURLで許可されていません。私の聴衆は一般的に英語を話しますが、彼らは旅行するので、彼らは次のような名前を含めるのが好きです

アイットベンハドゥ

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

これまでにいくつかの解決策を見てきました:

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

  2. 許可されていないすべての文字を削除し、スペースを置き換え、charcode(stackoverflow.com)を残すだけです。これは、「regex-hammer」が使用されているため
    、奇妙な結果が得られる 可能性があります。'tést tést' → /questions/0000/t233st-t233st

  3. 「最も近い同等物」に翻訳する
    'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
    しかし、これはドイツ語ではうまくいかない。たとえば、「ü」は「ue」に音訳する必要があります。

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

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

したがって、問題は次のとおりです。

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

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

4

6 に答える 6

16

最終的に、この問題については、「正しい」という考えをあきらめる必要があります。文字列の翻訳は、どのように行っても、互換性と読みやすさという名目で正確性を損ないます。3 つのオプションはすべて同等に互換性がありますが、#1 と #2 は読みやすさの点で問題があります。したがって、それを実行して、最適に見えるものを選択してください — オプション #3.

はい、ドイツ語の翻訳は間違っていますが、タイトルの言語を指定するようにユーザーに要求し始めない限り (そして言語を 1 つだけに制限しない限り)、その価値よりもはるかに多くの努力なしにその問題を解決することはできません。(たとえば、既知の各言語の辞書を使用してタイトルの各単語を実行し、その言語のルールに従ってその単語の分音符号を翻訳するとうまくいきますが、それは過度です。)

または、ドイツ語が他の言語よりも重要である場合は、ドイツ語版が存在する場合は常にドイツ語版を使用するように翻訳します: ä→<code>ae, ë→<code>e, ï→<code>i, ö→<code>oe, ü→<コード>ue.

編集:

ああ、実際の方法については、特殊なケースがある場合は を介し​​て翻訳し、残りstr_replaceを使用します。iconv

$text = str_replace(array("ä", "ö", "ü", "ß"), array("ae", "oe", "ue", "ss"), $text);
$text = iconv('UTF-8', 'US-ASCII//TRANSLIT', $text);
于 2009-01-21T17:06:37.080 に答える
3

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

ï -> iたとえば、小さな辞書を使用して、ü -> ueさまざまな文字をどのように翻訳するかを指定できます。

于 2009-01-21T16:41:06.743 に答える
1

いいトピックです。しばらく前に同じ問題が発生しました。
これが私がそれを修正した方法です:

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. 残っているすべての奇妙な文字を削除します
于 2010-01-23T21:38:11.650 に答える
1

興味深い補足として、SO では、ID の後には何も重要ではないようです。これは、このページへのリンクです。

「きれいな URL」を書き換える際の分音記号 (アクセント) の処理方法

明らかに、動機はリンクを壊さずにタイトルを変更できるようにすることであり、その機能も検討する必要があるかもしれません.

于 2009-01-21T17:23:27.953 に答える
0

現在、人々は任意のUTF-8文字を含むタイトルを書くことができますが、ほとんどはURLで許可されていません。

それどころか、ほとんどが許可されています。たとえば、WikipediaのURL ( http://en.wikipedia.org/wiki/Café(別名http://en.wikipedia.org/wiki/Caf%C3%A9)など)は、StackOverflowのハイライターが表示されない場合でも適切に表示されます。 tそれらを正しく選択してください:-)

秘訣は、あらゆるホスティング環境でそれらを確実に読み取ることです。たとえば、CGIサーバーとWindowsサーバー、特にIISに問題があります。

于 2009-01-21T17:40:58.103 に答える
0

これは良い機能です:

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;
}
于 2014-11-24T12:54:02.123 に答える