通过替换特殊字符来实现seolink生成器功能

时间:2012-10-01 13:24:07

标签: php cakephp

我正在尝试创建一个接受字符串并将其转换为seolink的函数。 但它看起来非常不专业

优化它的更好方法是什么?因为可能有太多特殊字符。

功能看起来像

  function seo_url($title) {
        $titel = substr($title,0,160);

        // Replace underscore with "-" 
        $titel = ereg_replace("_","-",$title);

        // Replace space with "-" 
        $titel = ereg_replace(" ","-",$title); 

       // Replace special characters
        $titel = Ereg_replace ("À", "A", $Titel); 
        $titel = ereg_replace("í", "i", $title); 
        $titel = ereg_replace("ó", "o", $title); 
        $titel = ereg_replace("ú", "u", $title); 
        $titel = ereg_replace("ñ", "n", $title); 
        $titel = ereg_replace("Ñ", "n", $title); 

        $titel = Strtolower (trim($title)); 

5 个答案:

答案 0 :(得分:1)

我使用此功能来清理网址,与您的网站类似,但不使用正则表达式:

function seo_url($str) {
  $str = mb_strtolower($str);
  $str = trim($str);
  $str = str_replace(array(' ', '\'', ',', '.', ';', ':'), '', $str);
  $str = str_replace('_', '-', $str);
  $str = str_replace(array('á', 'é', 'í', 'ó', 'ú', 'ö', 'ü', 'à', 'è', 'ì', 'ò', 'ù', 'â', 'ê', 'î', 'ô', 'û', 'ñ', 'ç'),
                     array('a', 'e', 'i', 'o', 'u', 'o', 'u', 'a', 'e', 'i', 'o', 'u', 'a', 'e', 'i', 'o', 'u', 'n', 'c'),
                     $str);


  return $str;
}

答案 1 :(得分:1)

为什么要说出要替换的内容而不是要在字符串中保留什么。这就像向后走。例如:

$string = preg_replace('/[^a-z0-9_]/i', '_', $string); 
$string = preg_replace('/_[_]*/i', '_', $string); 

以及以下完整功能:

public function getStringAsURL($string){ 
            // Define the maximum number of characters allowed as part of the URL 

            $currentMaximumURLLength = 100; 

            $string = strtolower($string); 

            // Any non valid characters will be treated as _, also remove duplicate _ 

            $string = preg_replace('/[^a-z0-9_]/i', '_', $string); 
            $string = preg_replace('/_[_]*/i', '_', $string); 

            // Cut at a specified length 

            if (strlen($string) > $currentMaximumURLLength) 
            { 
                $string = substr($string, 0, $currentMaximumURLLength); 
            } 

            // Remove beggining and ending signs 

            $string = preg_replace('/_$/i', '', $string); 
            $string = preg_replace('/^_/i', '', $string); 

            return $string; 
        } 

答案 2 :(得分:0)

从我所知道的方式来看,我认为你会从阅读.htaccess RewriteRule

中受益

从PHP中删除这种逻辑非常有用

这里的an example我在这里找到了使用这种逻辑(为谷歌相关的搜索引擎优化重写空格)

答案 3 :(得分:0)

使它看起来更整洁更小的唯一真正方法是在正则表达式中使用或表达式。

ereg_replace("Ñ|ñ", "n", $title);
ereg_replace("è|é|ê|ë","e", $title);

据我所知,这是最常见的做法,也是我想要更快猜测的。

您可以下载角色地图或创建自己的角色地图以生成正则表达式字符串,然后自己存储角色地图以便于编辑。

然后你的代码会再次变得更小,更健壮,因为它会加载到外部字符映射中,外部字符映射将每个字符映射到它的对应部分。

另一种解决方案 Removing Accented UTF-8 Characters With PHP

答案 4 :(得分:0)

使用班级功能Translit::makeUrl($str)

final class Translit {

    static function translit($string) {

        $replace=array(
            "_"=>"-",
            "`"=>"",
            "a"=>"a",
            "À"=>"A",
            "б"=>"b",
            "Б"=>"B",
            // etc.
        );
        return $str=iconv("UTF-8","UTF-8//IGNORE",strtr($string,$replace));
    }

    static function makeUrl($str) {
        $result = self::translit($str);

        $result = str_replace(' ', '-', $result);
        $result = preg_replace('/[\-]{2,}/','', $result);

        return strtolower($result);
    }
}