URL, дружественный поисковой системе (SEF / SEO) - PullRequest
1 голос
/ 01 апреля 2011

Я хочу, чтобы дружественные имена URL были преобразованы в:

Tom's Fish & Chips
Слизняк: рыба-чипсы

1-2-3 Пицца
слизень: 1-2-3-пицца

Здесь функция:

<?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 ]

10 голосов
/ 01 апреля 2011
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
3 голосов
/ 01 апреля 2011

Для удаления нескольких пробелов можно добавить следующее:

$title = preg_replace('/\s+/', ' ', $title);

Следующее, чтобы преобразовать &:

$title = str_replace('&', 'and', $title);

и вы должны включить тире в свое первое регулярное выражение:

$title = preg_replace("/(.*?)([A-Za-z0-9-\s]*)(.*?)/", "$2", $title);
2 голосов
/ 01 апреля 2011

Поместите это в перед регулярное выражение:

$title = str_replace ('&', 'and', $title);

Если вы работаете с акцентированными символами, вы хотите преобразовать их в us-ascii до регулярного выражения, чтобы не потерять их (á станет a, ő станет o и т. Д.):

$title = iconv ("UTF-8", "ISO-8859-1//TRANSLIT", $title);

Также ваш RegEx может быть немного упрощен. Это изменит последовательные не алфавитно-цифровые символы в один символ '-'.

$title = preg_replace ("/[^a-z0-9]+/i", "-", $title);

Также вы не хотите, чтобы ваш заголовок начинался или заканчивался -. Следующее регулярное выражение удалит их:

$title = trim ($title, '-');
0 голосов
/ 01 августа 2012

Версия Webarto идеально подходит. Я подумал, что, возможно, эта версия может быть полезна кому-то, потому что она учитывает разные вещи, такие как транслитерация, изменение & на -and- и декодирование сущностей ... эти вещи зависят от того, как данные хранятся в БД и т.д. Обратите внимание, что это также предполагает среду 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...