2011-03-07 29 views
6

想象一個包含UTF-8中幾個單詞的任何給定語言(英語,阿拉伯語,日語等)的標題字符串。例如:如何將漂亮的頁面標題轉換爲有效的URL字符串?

$stringRAW = "Blues & μπλουζ Bliss's ブルース Schön"; 

現在,這實際上需要轉換到的東西多數民衆的頁面的URL的有效部:

$stringURL = "blues-μπλουζ-bliss-ブルース-schön" 

just check out this link 這工作我的服務器上呢!

Q1。哪些字符最近被允許作爲有效的URL?我記得在瀏覽器中看到過阿拉伯字符串,我在apache 2上測試過它,並且一切正常。

我guesse它必須成爲: $stringURL = "blues-blows-bliss-black"

Q2。你知道哪些現有的php函數能夠正確地對這些UTF-8字符串進行編碼/轉換,以將URL從任何無效字符中剝離出來?

我guesse至少有:1。 空間應該被轉換爲破折號-
2.刪除無效字符?這是他們? @和'&'?
3.將所有字母轉換爲小寫(或首字母縮寫字母在網址中有效嗎?)

感謝:您的建議非常感謝!

+1

強烈的相關:http://stackoverflow.com/questions/465990/how-to-handle-diacritics-accents-when-rewriting-pretty-urls – 2011-03-07 16:28:56

+1

'(將任何無效的東西,如'或&空格)' - 這些在技術上不是無效的。他們只需通過'urlencode'編碼 – 2011-03-07 16:51:11

+0

真棒鏈接Pekka! +1這是一個質量的鏈接,特別是在外國的字符問題 – Sam 2011-03-07 16:55:08

回答

6

我會用:

$stringURL = str_replace(' ', '-', $stringURL); // Converts spaces to dashes 
$stringURL = urlencode($stringURL); 
+0

如果你要去urlencode,爲什麼要更換空格? – 2011-03-07 16:49:59

+1

因爲urlencode用'+'替換空格。鑑於他要求將空格替換爲破折號。 – Josh 2011-03-07 16:51:41

2

挑選你的網頁 $title = "mytitle#$3%#$5345"稱號; 簡單地進行urlencode它

$url = urlencode($title); 

你不需要擔心小細節,但請記住,以確定使用一個唯一的ID前綴的網址,如/389894/sdojfsodjf您的URL請求其最好的,路由選擇過程中,你可以使用ID 389894獲得話題sdojfsodjf。

+1

由於大多數瀏覽器現在都顯示未編碼的url(除非在某些情況下粘貼了編碼的url),所以我傾向於選擇此選項。 – 2011-03-07 16:46:37

+0

確實我有一些像'/ en /'語言和文件'/番茄/'的標識,以獲得tomato.php英文。然後我想添加標題,使'/ en/tomato/whatever-blabla'這樣好嗎?任何超鏈接,可以幫助我通過htaccess/apache設置這最後添加的部分? – Sam 2011-03-07 19:20:13

+0

@Kevin,你的意思是「顯示未編碼的網址」,你的意思是它們全都與未編碼的網址anywaz兼容,或者你的意思是顯示錯誤的代碼,我們總是*應該*使用urlencode(); ? – Sam 2011-03-07 19:21:28

1

下面是一個簡短&方便的一個做的伎倆,我

$title = trim(strtolower($title)); // lower string, removes white spaces and linebreaks at the start/end 
$title = preg_replace('#[^a-z0-9\s-]#',null, $title); // remove all unwanted chars 
$title = preg_replace('#[\s-]+#','-', $title); // replace white spaces and - with - (otherwise you end up with ---) 

,當然你需要處理變音符號,貨幣符號等等取決於在可能的輸入

10

這是我使用的解決方案:

$text = 'Nevalidní Český text'; 
$text = preg_replace('/[^\\pL0-9]+/u', '-', $text); 
$text = trim($text, "-"); 
$text = iconv("utf-8", "us-ascii//TRANSLIT", $text); 
$text = preg_replace('/[^-a-z0-9]+/i', '', $text); 

URL中的首都不是問題,但如果您希望文本是小寫,那麼只需在末尾添加$text = strtolower($text); :-)。

+1

用於處理外來字符的+1 – 2011-03-07 16:47:27

+0

謝謝! Upvoted +1。如何在你的答案中添加strtolower()?謝謝 – Sam 2011-03-07 16:48:55

+1

在最後一行後面加上另一行說'$ text = strtolower($ text);'。 – 2011-03-07 16:51:57

相關問題