2009-01-21 70 views
19

我重寫網址以包含用戶生成的旅行博客的標題。如何在重寫'漂亮的網址'時處理變音符號(重音符號)

我這樣做是爲了可讀性和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. 只是剝離所有非允許的字符,替代空間,離開則charCode(stackoverflow.com)很可能是因爲「正則表達式錘」的使用
    這給奇怪的結果: 'tést tést' → /questions/0000/t233st-t233st

  3. 翻譯成'最近的等值'
    'Aït Ben Haddou' → /gallery/280-Ait_Ben_Haddou/
    但是這對德國人來說是錯誤的;例如'ü'應該是音譯'ue'。

對於我來說,作爲荷蘭人,第三個結果'看起來'最好。我很確定(1)很多人會有不同的看法,(2)在德國的例子中,這顯然是錯誤的。

第三個選項的另一個問題是:如何找到所有可以轉換爲7位等效的字符?

所以,問題是:

  1. 什麼,在你看來,是最理想的結果。 (技術範圍內)

  2. 如何從技術上解決它。 (達到預期的結果)與PHP。

+0

「ü」實際上會寫成「ue」。 「oe」是「ö」。 :) – Bombe 2009-01-21 16:36:49

+0

[IDNA](http://en.wikipedia.org/wiki/IDNA) – 2009-01-21 16:39:37

+0

我知道國際化域名,但他們不解決該資源路徑的問題,也不是很可讀 – Jacco 2009-01-21 16:47:07

回答

16

最終,你將不得不放棄對這個問題的「正確」的想法。翻譯字符串,無論你如何做,都會以兼容性和可讀性的名義破壞準確性。所有三個選項同樣兼容,但#1和#2在可讀性方面受到影響。所以,只要運行它,然後選擇最好的選項 - 選項#3。

是的,德語的翻譯是錯誤的,但除非您開始要求您的用戶指定其標題所在的語言(並將其限制爲僅限一種語言),否則無需付出更多努力就無法解決該問題比它的價值。 (例如,根據其語言的規則將工作在字典中每個已知語言運行在標題中各個單詞和翻譯這個詞的變音符號,但它是過度的。)

另外,如果德國是一個高關注比其他的語言,讓您的翻譯始終使用德語版本時,一個存在:äaeëeïiöoeüue

編輯:

哦,至於實際的方法,我會翻譯的特殊情況下,如果有的話,通過str_replace,然後使用iconv爲休息:

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

iconv // TRANSLIT看起來有用,謝謝 – Jacco 2009-01-21 17:34:21

3

對我來說第三個是最具可讀性的。

你可以使用一個小詞典例如ï -> iü -> ue來指定您希望如何翻譯各種charcaters。

+0

問題是,法語和德語的翻譯不同,更不用說土耳其語或越南語。 – Jacco 2009-01-21 16:48:17

+0

也許使用不同的字典(如果你知道它是哪種語言),或者總是使用最簡單的字典例如`ü - > u`。 – ChrisW 2009-01-21 16:55:01

0

現在人們可以編寫包含任何UTF-8字符的標題,但大多數不允許在URL中使用。

相反,大多數都是允許的。例如,見維基百科的網址 - 比如http://en.wikipedia.org/wiki/Café(又名http://en.wikipedia.org/wiki/Caf%C3%A9)顯示很好 - 即使StackOverflow上的熒光筆不正確地挑出來:-)

訣竅是在任何主機環境中可靠地讀取它們;例如,CGI和Windows服務器存在問題,尤其是IIS。

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. 將剩餘怪異字符
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; 
}