2010-10-29 3 views
10

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

Например:

Пример: быстрая коричневая лиса перепрыгнула РЕЗУЛЬТАТ:-быстро-коричнево-лисьей прыгнули

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

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

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

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


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

Спасибо!

+0

Возможно, вы захотите оставить дефисы, когда они находятся непосредственно между словами (например, «что-то» не следует переводить на «что-то») и другими особыми случаями. –

ответ

27

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

$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), '-')); 
+0

Спасибо! Прекрасно работает! – Paul

+2

Я думаю, что лучшей альтернативой является сначала заменить пробелы, затем не-пробельные/не-буквенно-цифровые. Во многих случаях небелые, не буквенно-цифровые символы не должны быть тире. Т.е.: «Женская ночь» была бы «женской ночью». Я бы сначала заменил пробелы ('/ \ s + /') тире, а затем заменил все остальное ('/ [^ a-zA-Z0-9] + /') пустой строкой. Вы также можете опустить отделку. –

+0

Редактировать, чтобы добавить: Вам нужно добавить штрих ко второй замене: '/ [^ a-zA-Z0-9 \ -] + /' –

17

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

Это образец строка:

$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 

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

Приветствия, Adriana

+0

Отлично !!!!!!!! – Leonardo

+0

Работает отлично! Спаси мою жизнь! Благодаря! – vinigarcia87

+0

Спустя 5 лет все еще работает как шарм. Легко, просто, мне это нравится. Спасибо, сэр! – LuBre

1

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

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

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

6

В функции:

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 ~`[email protected]#&$%^ &*()_+= ---{}|][ :"; <>?.,/ fóx - jümpëd_- 
// the-quick-fox-jumped 

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

+0

Я думаю, что это лучшее решение. – barell

+0

Приятный, я бы просто добавил '$ str = preg_replace ('/ - + /', '-', $ str)', чтобы удалить любые возможные последовательные пробелы. Пример: 'hello-how --- are-you' будет преобразован в' hello-how-are-you'. – LuBre

+0

Спасибо @LuBre, я включил ваши отзывы – gabssnake

Смежные вопросы