2016-05-26 41 views
1

我需要爲網頁生成slu((例如/ my-page-slug),其中slu will將從不斷增長的概念列表中生成。這些概念可以包含特殊字符,變音符號,標點符號等。我應該如何處理URL中的特殊字符?

我的目標是想出一個slu generation生成策略,它將強健並避免未來衝突,同時考慮URL可讀性和SEO。

我已經看過[RFC 3986] [1],並在像維基百科和Quora的網站,看看他們如何處理特定案件,包括:

  • 空間:維基百科使用下劃線,Quora的連字符
  • 變音符號(如莫里哀)
  • 其他特殊字符(如括號,冒號,逗號等)

到目前爲止,它看起來像沒有明確的標準或最佳實踐。

是否有特定的庫已經處理這個?還是必須實施我自己的定製解決方案?

現在,我正在考慮做以下的定製解決方案:按照RFC

  • URL編碼3986
  • 取代了一些「常見公約」的一些編碼字符(例如,連字符空間,剔除撇號等)
  • 剔除了多餘的空格

這是一個證明的概念:是這種方法有效定向?

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

像這樣的東西應該做的工作:

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; 
} 

你可以看到如何將特殊字符適應你的需要對前兩行。剩下的只是去掉空格並用' - '($ permalinksseparator的值)代替它們。

+0

感謝您的回覆!我測試了這一點,但它不處理像下面這樣的情況:C++被轉換爲「c」,這導致「C」或「C#」的問題。或者帶有特殊字符的名字(例如「PaulRicœur」) – Ralph

+0

我用稍微不同的方法更新了我的原始問題,解決了其中一些問題。這個方向有效嗎? – Ralph

+0

不確定你的新方法。你基本上是對一個字符串進行urlencoding,然後對它的一部分進行解碼。我可能是錯的,但我認爲這似乎打敗了生成可讀永久鏈接的目的。您最好通過生成「CPlusPlus」和「CSharp」的特例來處理C++和C#的示例。 – user13955