2010-04-05 94 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()影响的字符均应省略。