搜索引擎友好URL(SEF / SEO)

时间:2011-04-01 09:20:50

标签: php url

我希望将友好的网址转换为:

汤姆的鱼&芯片
Slug:tom-fish-and-Chips

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

我该如何解决?

4 个答案:

答案 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;
}