2010-04-05 138 views
6

可能重複:
URL Friendly Username in PHP?最好的辦法

IM使用正確的函數逃脫,並創建一個塞

我用這個莫名其妙困惑:

$slug_title = mysql_real_escape_string()($mtitle); 

但有人告訴我,不要使用它,並用urlencode()來

哪一個是蛞蝓和安全

,我可以在SO看到更好的,它插入 - 詞之間:

https://stackoverflow.com/questions/941270/validating-a-slug-in-django 
+0

查看我的答案在這裏 http://stackoverflow.com/questions/2955251/php-function-to-make-slug-url-string/10360316#10360316 – 2012-04-28 03:35:53

回答

11

使用MySQL或URL轉義不是要走的路。

Here is an article,做的更好:

function toSlug($string,$space="-") { 
    if (function_exists('iconv')) { 
     $string = @iconv('UTF-8', 'ASCII//TRANSLIT', $string); 
    } 
    $string = preg_replace("/[^a-zA-Z0-9 -]/", "", $string); 
    $string = strtolower($string); 
    $string = str_replace(" ", $space, $string); 
    return $string; 
} 

這也可以正確處理重音字符。

+0

問題是阿拉伯語和MB語言此功能無法正常工作並將所有字符更改爲 - – 2010-04-05 20:05:12

+2

不幸的iconv似乎跨平臺工作不一致:php -r'print iconv(「UTF-8」,「ASCII // TRANSLIT」,「bär」)。 「\ n」;」在Ubuntu(10.04)和'b'ar'在我的Mac上給'bar' – tuomassalo 2010-11-26 06:27:02

+3

啊... PHP的平臺獨立性...得愛它 – Thomas 2010-11-27 21:11:15

2

mysql_real_escape_string()與urlencode()的用途不同,它們都不適合創建slu。。

一個slu is應該是一個明確&有意義的短語,簡潔地描述該頁面。

mysql_real_escape_string()轉義危險字符,可以改變原始查詢字符串的用途。

urlencode()使用「%」和2個代表它們的代碼的十六進制數字(例如空格爲%20)來轉義無效的URL字符。通過這種方式,由於不愉快的字符序列,例如,由此產生的字符串而不是明確&有意義的http://www.domain.com/bad%20slug%20here%20%3C--

因此,除了通常用-替換的空格外,任何可能受urlencode()影響的字符均應省略。