Регулярное выражение - любой текст на URL дружественный - PullRequest
10 голосов
/ 29 октября 2010

PHP скрипт регулярного выражения для удаления всего, что не является буквой алфавита или цифрой от 0 до 9, и заменой пробела на дефис - измените его на строчные, убедитесь, что есть только один дефис - между словами no - или --- и т. Д.

Например:

Пример: быстрый бурый лис прыгнул Результат: быстрый-коричневый лис прыгнул

Пример: быстрый бурый лис прыгнул!Результат: быстрый бурый лис прыгнул

Пример: быстрый бурый лис прыгнул!Результат: the-quick-brown-fox-jumped

Пример: быстрый ~ `! @ # $% ^ & * () _ + = ------- brown {} |] [:"'; <>?., / fox - прыжок! Результат: the-quick-brown-fox-jumped

Пример: быстрый 1234567890 ~`! @ # $% ^ & * () _ + =------- коричневый {} |] [: "';<>?., / fox - прыгнул!Результат: the-quick-1234567890-brown-fox-jumped


У кого-нибудь есть идея для регулярного выражения?

Спасибо!

Ответы [ 5 ]

27 голосов
/ 29 октября 2010

Поскольку вы, похоже, хотите, чтобы все последовательности не буквенно-цифровых символов заменялись одним дефисом, вы можете использовать это:

$str = preg_replace('/[^a-zA-Z0-9]+/', '-', $str);

Но это может привести к появлению начальных или конечных дефисов, которые можно удалить с помощью trim:

$str = trim($str, '-');

И для преобразования результата в нижний регистр используйте strtolower:

$str = strtolower($str);

Итак, все вместе:

$str = strtolower($str);
$str = trim($str, '-');
$str = preg_replace('/[^a-z0-9]+/', '-', $str);

Или в компактном однострочнике:

$str = strtolower(trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $str), '-'));
18 голосов
/ 29 октября 2010

Я просто работал с чем-то похожим, и я придумал этот маленький кусочек кода, он также предполагает использование латинских символов.

Это пример строки:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&?¡?*liz cardillo y kiwi. La cigüeña ¨^;.-|°¬tocaba el saxofón detrás del palenque de paja';

Сначала я преобразую строку в htmlentities, чтобы потом было легче ее использовать.

$friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false);

Затем я заменяю латинские символы соответствующими символами ascii (á становится a, Ü становится U и т. Д.):

$friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);

Затем я преобразую строку обратно из объектов HTML в символы, снова дляпроще использовать позже.

$friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8");

Далее я заменяю все не алфавитно-цифровые символы на дефисы.

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

Я удаляю лишние дефисы внутристрока:

$friendlyURL = preg_replace('/-+/', '-', $friendlyURL);

Я удаляю начальные и конечные дефисы:

$friendlyURL = trim($friendlyURL, '-');

И, наконец, преобразую все в строчные буквы:

$friendlyURL = strtolower($friendlyURL);

Все вместе:

function friendlyUrl ($str = '') {

    $friendlyURL = htmlentities($str, ENT_COMPAT, "UTF-8", false); 
    $friendlyURL = preg_replace('/&([a-z]{1,2})(?:acute|circ|lig|grave|ring|tilde|uml|cedil|caron);/i','\1',$friendlyURL);
    $friendlyURL = html_entity_decode($friendlyURL,ENT_COMPAT, "UTF-8"); 
    $friendlyURL = preg_replace('/[^a-z0-9-]+/i', '-', $friendlyURL);
    $friendlyURL = preg_replace('/-+/', '-', $friendlyURL);
    $friendlyURL = trim($friendlyURL, '-');
    $friendlyURL = strtolower($friendlyURL);
    return $friendlyURL;

}

Тест:

$str = 'El veloz murciélago hindú comía fe<!>&@#$%&!"#%&-?¡?*-liz cardillo y kiwi. La cigüeña ¨^`;.-|°¬tocaba el saxofón detrás del palenque de paja';

echo friendlyUrl($str);

Результат:

el-veloz-murcielago-hindu-comia-fe-liz-cardillo-y-kiwi-la-ciguena-tocaba-el-saxofon-detras-del-palenque-de-paja

Я думаю, что ответ Гамбо лучше подходит вашей проблеме, и это более короткий код, но я подумал, что он будет полезен для других.

Приветствия, Адриана

6 голосов
/ 01 октября 2013

В функции:

function sanitize_text_for_urls ($str) 
{
    return trim( strtolower( preg_replace(
        array('/[^a-z0-9-\s]/ui', '/\s/', '/-+/'),
        array('', '-', '-'),
        iconv('UTF-8', 'ASCII//TRANSLIT', $str) )), '-');
}

Что она делает:

// Solve accents and diacritics
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);

// Leave only alphanumeric (respect existing hyphens)
$str = preg_replace('/[^a-z0-9-\s]/ui', '', $str);

// Turn spaces to hyphens
$str = preg_replace('/\s+/', '-', $str);

// Remove duplicate hyphens
$str = preg_replace('/-+/', '-', $str);

// Remove trailing hyphens
$str = trim($str, '-');

// Turn to lowercase
$str = strtolower($str);

Примечание:
Вы можете объединить несколько preg_replace, передав массив.См. Функцию вверху.

Например:

// Électricité, plâtrerie    -->  electricite-platrerie
// St. Lücie-Pétêrès         -->  st-lucie-peteres
// -Façade- & gros œuvre     -->  facade-gros-oeuvre

// _-Thè quîck ~`!@#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_-
// the-quick-fox-jumped

EDIT: добавлено "/ u" в конце регулярного выражения для использования UTF8
EDIT: учитывается дублирование иведущие / конечные дефисы, благодаря @ LuBre

1 голос
/ 02 июня 2011

Если вы используете это для имен файлов в PHP, ответ от Gumbo будет

$str = preg_replace('/[^a-zA-Z0-9.]+/', '-', $str);
$str = trim($str, '-');
$str = strtolower($str);

Добавлен период для имен файлов, и он strtolower(), а не strtolowercase().

0 голосов
/ 29 октября 2010
$str = preg_replace('/[^a-zA-Z0-9]/', '-', $str);
...