我希望将友好的网址转换为:
汤姆的鱼&芯片1-2-3比萨饼 slu :: 1-2-3-Pizza
这是一个功能:
<?php
function urlTitle($title) {
$title = preg_replace("/(.*?)([A-Za-z0-9\s]*)(.*?)/", "$2", $title);
$title = str_replace(' ', '-', $title);
$title = strtolower($title);
return $title;
}
echo urlTitle("Tom's Fish & Chips");
echo "<br />";
echo urlTitle("1-2-3 Pizza");
?>
上面这个函数的行为几乎我想要的东西,因为我得到了:
toms-fish--chips
123-pizza
我该如何解决?
答案 0 :(得分:10)
function seo($input){
$input = str_replace(array("'", "-"), "", $input); //remove single quote and dash
$input = mb_convert_case($input, MB_CASE_LOWER, "UTF-8"); //convert to lowercase
$input = preg_replace("#[^a-zA-Z0-9]+#", "-", $input); //replace everything non an with dashes
$input = preg_replace("#(-){2,}#", "$1", $input); //replace multiple dashes with one
$input = trim($input, "-"); //trim dashes from beginning and end of string if any
return $input; //voila
}
第二个preg_replace用一个短划线替换多个短划线。
示例:
echo seo("Tom's Fish & Chips"); //toms-fish-chips
echo seo("1-2-3 Pizza"); //123-pizza
答案 1 :(得分:3)
您可以添加以下内容以删除多个空格:
$title = preg_replace('/\s+/', ' ', $title);
以下转换&amp;:
$title = str_replace('&', 'and', $title);
并且您应该在第一个正则表达式中包含短划线:
$title = preg_replace("/(.*?)([A-Za-z0-9-\s]*)(.*?)/", "$2", $title);
答案 2 :(得分:2)
将其放在之前正则表达式:
$title = str_replace ('&', 'and', $title);
如果您正在使用重音字符,您希望在正则表达式之前将它们转换为us-ascii,而不是将它们松散(á
将变为a
,ő
将变为{ {1}}等。):
o
此外,您的RegEx可以简化一些。这会将连续的非字母数字字符更改为单个“ - ”。
$title = iconv ("UTF-8", "ISO-8859-1//TRANSLIT", $title);
此外,您不希望您的标题以$title = preg_replace ("/[^a-z0-9]+/i", "-", $title);
开头或结尾。以下正则表达式将删除它们:
-
答案 3 :(得分:0)
Webarto的版本非常完美。我想也许这个版本可能对某人有用,因为它需要考虑不同的事情,例如音译,将&
更改为-and-
,以及实体解码...这些都取决于数据的存储方式在db等中注意,这也假定为UTF-8环境:)
function seo( $str )
{
$str = strip_tags($str); // tags out, just in case
$str = html_entity_decode($str,ENT_QUOTES,'UTF-8'); // entities to text
$str = strtolower($str); // lowercase
$str = str_replace('&', ' and ', $str); // & to and
$str = iconv('UTF-8','ASCII//TRANSLIT', $str); // transliterate
$str = preg_replace('/[\s]/', '-', $str); // space to dash
$str = preg_replace('/[^a-z0-9-]/', '', $str); // only alphanumeric and dash
$str = preg_replace('#(-){2,}#', '$1', $str); // 2+ dashes to 1
$str = trim($str, '-'); // no dashes at beginning or end
return $str;
}