2016-05-26 9 views
1

私はページのためのスラッグ(例えば、/ my-page-slug)を生成する必要があります。スラッグは、ますます成長する概念のリストから生成されます。これらの概念には、特殊文字、発音区別記号、句読点などを含めることができます。URLに特殊文字をどのように処理すればよいですか?

私の目標は、URLの可読性とSEOを考慮しながら、堅牢で将来の競合を回避するスラッグ生成戦略を考え出すことです。

Iを含む、[1]と、彼らは特定のケースを扱う方法を確認するために、ウィキペディアやQuoraのようなサイトで、[RFC 3986]を見てきました

  • スペース:ウィキペディアはアンダースコアを使用して、Quoraのハイフン
  • 発音区別符号明確な標準やベストプラクティスが存在しないように(例えばモリエール)
  • その他の特殊文字(例えば括弧、コロン、コンマなど)

はこれまでのところ、それが見えます。

これを既に処理している特定のライブラリはありますか?あるいは私自身のカスタムソリューションを実装する必要がありますか?

は今、私は次のことを行いカスタムソリューションを検討している:

  • URLがRFCごとにエンコードする3986
  • スペースのためにいくつかのエンコードされたいくつかの「一般的に見られる規則」の文字(たとえばハイフンを置き換え、
  • ストリップアウト余分なスペース

)など、アポストロフィを取り除くこれは、概念実証である:このアプローチは、方向有効ですか?あなたが最初の2行にあなたの必要性に特殊文字を適応させる方法を見ることができます

public static function formatUrlPermalink ($var) 
{ 
    $permasearch = explode(',', "À,Á,Â,Ã,Å,à,á,â,ã,å,Ò,Ó,Ô,Õ,Ø,ò,ó,ô,õ,ø,È,É,Ê,Ë,è,é,ê,ë,Ç,ç,Ì,Í,Î,Ï,ì,í,î,ï,Ù,Ú,Û,ù,ú,û,ÿ,Ñ,ñ,ß,ä,Ä,ö,Ö,ü,Ü"); 
    $permareplace = explode(',', "A,A,A,A,A,a,a,a,a,a,O,O,O,O,O,o,o,o,o,o,E,E,E,E,e,e,e,e,C,c,I,I,I,I,i,i,i,i,U,U,U,u,u,u,y,N,n,ss,ae,Ae,oe,Oe,ue,Ue"); 
    foreach ($permasearch as $key => $value) { 
     $var = mb_ereg_replace ($value, $permareplace[$key], $var); 
    } 

    $var = preg_replace ("#(\s*\/\s*|\s*\+\s*|\s+)#", '-', strtolower($var)); 

    $permalinksseparator = '-'; 
    $var = mb_ereg_replace ("[^a-z0-9_{$permalinksseparator}]", '', $var, "imsr"); 
    $var = preg_replace ('/'.$permalinksseparator.'+/', $permalinksseparator, $var); // remove replicated separator 
    $var = trim ($var, $permalinksseparator); 

    return $var; 
} 

:このような

function generateSlug($topic) { 

    // URL encode 
    $topic = rawurlencode($topic); // encodes according to RFC 3986: http://www.faqs.org/rfcs/rfc3986.html 

    // Transform specific characters 
    $topic = preg_replace('/%E2%80%93/', '-', $topic); // decode en dash as hyphen 
    $topic = preg_replace('/%E2%80%94/', '--', $topic); // decode em dash as double-hyphen 
    $topic = preg_replace('/%E2%80%A6/', '%20', $topic); // convert ellipsis to space 
    $topic = preg_replace('/%26/', '%20', $topic); // convert ampersand to space 
    $topic = preg_replace('/%2F/', '%20', $topic); // convert forward to space 
    $topic = preg_replace('/%3F/', '', $topic); // strip out question marks 
    $topic = preg_replace('/%28/', '(', $topic); // decode opening parenthesis 
    $topic = preg_replace('/%29/', ')', $topic); // decode closing parenthesis 
    $topic = preg_replace('/%21/', '!', $topic); // decode exclamation mark 
    $topic = preg_replace('/%27/', '', $topic); // strip apostrophes 
    $topic = preg_replace('/%22/', '', $topic); // strip double quotation 
    $topic = preg_replace('/%2A/', '*', $topic); // decode asterisk 
    $topic = preg_replace('/%2C/', '', $topic); // strip comma 
    $topic = preg_replace('/%3A/', '', $topic); // strip colon 
    $topic = preg_replace('/%3B/', '', $topic); // strip semicolon 

    $topic = trim($topic); // remove leading and trailing spaces 
    $topic = preg_replace('/(%20)+/', '-', $topic); // convert one or more spaces into single space 

    return $topic; 

} 

答えて

0

何かが仕事をする必要があります。残りの部分はスペースを取り除き、 ' - '($ permalinksseparatorの値)に置き換えます

+0

お返事ありがとう!私はこれをテストしましたが、次のようなケースは処理しません。C++は "C"に変換され、 "C"または "C#"の問題を引き起こします。または特殊文字(例:「PaulRicœur」)の名前 – Ralph

+0

私は元の質問を、これらの問題のいくつかを解決するやや異なる方法で更新しました。これは方向性が有効ですか? – Ralph

+0

新しいアプローチについてはわかりません。あなたは基本的に文字列をurlencodingして、その部分をunlencodingしています。私は間違っているかもしれませんが、これは読めるパーマリンクを生成する目的を打ち負かしているようです。あなたのC++とC#の例は "CPlusPlus"と "CSharp"を生成する特殊なケースで処理するのが最善です。 – user13955

関連する問題