PHP urlize函数

时间:2010-05-26 07:42:54

标签: php dynamic

我在我的网站上使用此功能将用户输入转换为可接受的URL:

function urlize($url) { 
$search = array('/[^a-z0-9]/', '/--+/', '/^-+/', '/-+$/' ); 
$replace = array( '-', '-', '', ''); 
return preg_replace($search, $replace, utf2ascii($url)); 
}     
function utf2ascii($string) { 
$iso88591  = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7"; 
$iso88591 .= "\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF"; 
$iso88591 .= "\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF7"; 
$iso88591 .= "\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF"; 
$ascii = "aaaaaaaceeeeiiiidnooooooouuuuyyy"; 
return strtr(mb_strtolower(utf8_decode($string), 'ISO-8859-1'),$iso88591,$ascii); 
}

我遇到了问题,有数字。出于某种原因,当我尝试:

echo urlize("test 23342");

我得到“test-eiioe”。为什么这样,我该如何解决?

非常感谢!

5 个答案:

答案 0 :(得分:2)

嘿,看起来你正试图创造一个slu ..如果是这样,这是我使用/建议的功能:

function slug( $string ) {
    return strtolower( preg_replace( array( '/[^-a-zA-Z0-9\s]/', '/[\s]/' ), array( '', '-' ), $string ) );
}

答案 1 :(得分:2)

问题在于你的utf2ascii。我建议你改用iconv()函数。

iconv("UTF-8", "ISO-8859-1//IGNORE", $string);

输出编码中的// IGNORE部分意味着忽略它无法翻译的任何字符。坏消息是你失去了所有重音字符。为了保留它们,你可以使用// TRANSLIT。

然后,您可以使用strtolower和一些regexp来消除非字母数字字符(或用 - 替换它们)。

如果您想对任何数据进行编码,还有urlencode(),但这不会让您获得很好的链接。

答案 2 :(得分:1)

urlencode()有什么问题?

答案 3 :(得分:0)

你的utf2ascii函数是错误的,那是test 23342变为test eiioe的那个。

为什么不使用iconv进行从UTF-8到ISO-8859-1的转换?即。使用iconv("UTF-8", "ISO-8859-1//TRANSLIT", $url);

答案 4 :(得分:0)

我在Maxime Michel的回答中添加了重音字符替换:

function urlize($url) {
    $search = array('/[^a-z0-9]/', '/--+/', '/^-+/', '/-+$/' );
    $replace = array( '-', '-', '', '');
    $unwanted_array = array(    'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
                    'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U',
                    'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c',
                    'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
                    'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y' );
    $url = strtr( $url, $unwanted_array );
    $url = strtolower(iconv("UTF-8", "ISO-8859-1//TRANSLIT", $url));
    return preg_replace($search, $replace, $url);
}