Как улучшить мой генератор URL Seo - PullRequest
1 голос
/ 18 января 2010

У меня есть эта функция, которая генерирует SEO дружественный URL-адрес из строки:

 function seo_titleinurl_generate($title)
         {


            $title=substr($title,0,160);

            $title = ereg_replace(" ", "-", $title); // replace spaces by "-"

            $title = ereg_replace("á", "a", $title); // replace special chars

            $title = ereg_replace("í", "i", $title); // replace special chars

            $title = ereg_replace("ó", "o", $title); // replace special chars

            $title = ereg_replace("ú", "u", $title); // replace special chars

            $title = ereg_replace("ñ", "n", $title); // replace special chars

            $title = ereg_replace("Ñ", "n", $title); // replace special chars

            $title = strtolower(trim($title)); // lowercase
            $title = preg_replace("/([^a-zA-Z0-9_-])/",'',$title); // only keep  standard latin letters and numbers, hyphens and dashes

           if($title=="" or $title=="-"){
           $mr=rand(1,99999);
           $mt=time();
           $title=$mr.$mt;
         }

             return $title;
     }

Но в некоторых случаях, когда строка имеет несколько пробелов, например: самые (3 spaces here) хорошие шалости это порождает: самые --- приятные розыгрыши

Я хочу, чтобы он игнорировал много пробелов и делал их только одним штрихом.

Спасибо

Ответы [ 5 ]

1 голос
/ 18 января 2010

Я думаю, что это может быть немного быстрее, чем предыдущий ответ, потому что он не будет возиться с пробелами (я могу ошибаться):

$title = preg_replace('/\s\s+/', ' ', $title);
0 голосов
/ 19 января 2010

Взгляните на следующий код:

function Slug($string)
{
    return strtolower(trim(preg_replace(array('~[^0-9a-z]~i', '~-+~'), '-', preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'))), '-'));
}
0 голосов
/ 18 января 2010

Я предлагаю следующее:

/**
* Produce a title with lowercase alphanumeric characters, underscores, 
* and dashes.  There should be no instances of multiple concurrent dashes, 
* and no spaces.
*
* @param string $title the title being sanitized
*
* @return string the sanitized title, or a concatenation of a random 
*                number and the current time
*/
function seoTitleInUrlGenerate($title)
{
    $title = substr( 
                 preg_replace(
                     array("/([^a-zA-Z0-9_-])/", "/([--]{2,})+/"),
                     array('', '-'),
                     strtolower( strtr( trim($title), 'áéíóúñÑ ', 'aeiounN-' ) )
                 ), 0, 160
             );

    if ($title == "" or $title == "-")
    {
        return rand(1, 99999) . time();
    }
    else
    {
        return $title;
    }
 }

При тестировании с предоставленным вами входом ...

echo seoTitleInUrlGenerate('the most    nice pranks!'); // "the-most-nice-pranks"

Вместо того, чтобы возвращать случайное число и время, я бы предложил вернуть FALSE, если вы не смогли создать действительный заголовок для использования в URL. Таким образом, возможно, вы сможете где-то записать неверный заголовок и исправить это позже. С такой функцией, как сейчас, вы просто получаете числовое возвращаемое значение и не знаете, является ли это результатом недопустимого заголовка или действительным заголовком, который оказался полон чисел.

0 голосов
/ 18 января 2010

Используется preg_replace, поскольку ereg_replace устарело и исчезнет в будущей версии PHP.Он также использует массивы для уменьшения количества вызовов функций и str_replace для замены один к одному (это быстрее):

function seo_titleinurl_generate($title)
{
        $title = substr(strtolower(trim($title)),0,160);

        $title = preg_replace('/\s+/', '-', $title); // replace spaces by "-"
        $title = str_replace(array("á","í","ó","ú","ñ","Ñ"), array("a","i","o","u","n","n"), $title);// replace special chars
        $title = preg_replace('/\W-/', '', $title); // only keep  standard latin letters and numbers, hyphens and dashes

        if($title=="" or $title=="-"){
            $mr=rand(1,99999);
            $mt=time();
            $title=$mr.$mt;
        }
        return $title;
 } 
0 голосов
/ 18 января 2010

Просто добавьте в начале:

$title = ereg_replace(/\s+/, " ", $title); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...