改进将字符串转换为可读 url
Posted
技术标签:
【中文标题】改进将字符串转换为可读 url【英文标题】:Improve converting string to readable urls 【发布时间】:2012-06-15 08:55:31 【问题描述】:以下函数重写包含各种字符的新闻和产品标题的 url。我希望创建的字符串仅包含字母数字值和“-”,但没有结尾“-”或空格,也没有重复的“-”。下面的函数运行良好,但我想知道是否有任何方法可以更简单或更高效地编写它?
function urlName($string)
$string = trim($string); // no open ends
$string = strtolower($string); // all lowercase
$string = strtr($string, 'äöåÄÖÅ', 'aoaaoa'); // substitute umlauts
$string = preg_replace('/[\W]+/', '-', $string); // substitute non-word characters with -
$string = preg_replace('/^-*|-*$/', '', $string); // no beinging or ending -
return $string;
【问题讨论】:
这里之前已经问过这个问题,其中包含代码。现在正在寻找它。 URL Friendly Username in php? 的可能重复项 为什么只有变音符号?áéüíú
等其他特殊字符呢?
-bažmegakapa 域没有,因此大多数用户希望路径表现相似。 -约翰康德感谢链接 - 我认为问题有点相似,但不完全相同。他不关心包含非单词字符的名称(例如 % - & 等等)-Mike B ty,将尝试添加标签
-bažmegakapa 我实际上误读了您的评论。你对其他角色也很正确。我应该提到服务器正在运行 php 4.3,因此可能需要类似 yent 的转换表之类的东西:(
【参考方案1】:
我认为你的代码可以压缩成这样:
function urlName($string)
$patterns = array('/^[\s-]+|[\s-]+$/', '/[\W]+/');
$replacements = array('', '-');
$string = strtr(strtolower($string), 'äöåÄÖÅ', 'aoaaoa');
// or you can use:
// $string = strtr(strtolower($string), $someTrMapping);
return preg_replace($patterns, $replacements, $string);
【讨论】:
感谢您的评论。我注意到无论如何正确的正则表达式过滤都不需要修剪。我会接受你的回答,因为我不知道你可以提供 preg_replace 匹配和替换数组,而不仅仅是单个值。【参考方案2】:我经常用这个:
function simpleText($s)
$rpl = array(
"À" => 'A', "Á" => 'A', "Â" => 'A', "Ã" => 'A', "Ä" => 'A', "Å" => 'A',
"à" => 'a', "á" => 'a', "â" => 'a', "ã" => 'a', "ä" => 'a', "å" => 'a',
"Ò" => 'O', "Ó" => 'O', "Ô" => 'O', "Õ" => 'O', "Ö" => 'O', "Ø" => 'O',
"ò" => 'o', "ó" => 'o', "ô" => 'o', "õ" => 'o', "ö" => 'o', "ø" => 'o',
"È" => 'E', "É" => 'E', "Ê" => 'E', "Ë" => 'E',
"è" => 'e', "é" => 'e', "ê" => 'e', "ë" => 'e',
"Ç" => 'C',
"ç" => 'c',
"Ì" => 'I', "Í" => 'I', "Î" => 'I', "Ï" => 'I',
"ì" => 'i', "í" => 'i', "î" => 'i', "ï" => 'i',
"Ù" => 'U', "Ú" => 'U', "Û" => 'U', "Ü" => 'U',
"ù" => 'u', "ú" => 'u', "û" => 'u', "ü" => 'u',
"Ÿ" => 'Y',
"ÿ" => 'y',
"Ñ" => 'N',
"ñ" => 'n'
);
$s = preg_replace('`\s+`', '_', strtr($s, $rpl));
$s = strtolower(preg_replace('`_+`', '_', preg_replace('`[^-_A-Za-z0-9]`', '', $s)));
return trim($s, '_');
【讨论】:
感谢您提供广泛的换算表。以上是关于改进将字符串转换为可读 url的主要内容,如果未能解决你的问题,请参考以下文章