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;
}
感謝您的回覆!我測試了這一點,但它不處理像下面這樣的情況:C++被轉換爲「c」,這導致「C」或「C#」的問題。或者帶有特殊字符的名字(例如「PaulRicœur」) – Ralph
我用稍微不同的方法更新了我的原始問題,解決了其中一些問題。這個方向有效嗎? – Ralph
不確定你的新方法。你基本上是對一個字符串進行urlencoding,然後對它的一部分進行解碼。我可能是錯的,但我認爲這似乎打敗了生成可讀永久鏈接的目的。您最好通過生成「CPlusPlus」和「CSharp」的特例來處理C++和C#的示例。 – user13955