PHP-код для создания безопасного URL-адреса?

Нам нужно создать уникальный URL-адрес из названия книги, где заголовок может содержать любой символ. Как мы можем выполнить поиск – заменить все «недопустимые» символы, чтобы создать правильный и аккуратный URL-адрес для просмотра?

Например:

"The Great Book of PHP" www.mysite.com/book/12345/the-great-book-of-php "The Greatest !@#$ Book of PHP" www.mysite.com/book/12345/the-greatest-book-of-php "Funny title " www.mysite.com/book/12345/funny-title 

Ах, увольнение

 // This function expects the input to be UTF-8 encoded. function slugify($text) { // Swap out Non "Letters" with a - $text = preg_replace('/[^\\pL\d]+/u', '-', $text); // Trim out extra -'s $text = trim($text, '-'); // Convert letters that we have left to the closest ASCII representation $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); // Make text lowercase $text = strtolower($text); // Strip out anything we haven't been able to convert $text = preg_replace('/[^-\w]+/', '', $text); return $text; } 

Это работает довольно хорошо, так как сначала использует свойства юникода каждого символа, чтобы определить, является ли это буквой (или \ d против числа), – тогда она преобразует те, которые не принадлежат к -у, тогда она транслитерирует на ascii, делает другая замена для чего-либо еще, а затем очистка после себя. (Тест Фабрика возвращается «arvizturo-tukorfurogep»)

Я также склонен добавлять в список стоп-слов – так что они удаляются из пули. «" из "" или "а" и т. д. (но не делайте этого по длине, или вы удаляете такие вещи, как «php»)

Если «invalid» означает не буквенно-цифровое выражение, вы можете сделать это:

 function foo($str) { return trim(preg_replace('/[^a-z0-9]+/', '-', strtolower($str)), '-'); } 

Это превратит $str в нижний регистр, заменит любую последовательность одного или нескольких не алфавитно-цифровых символов на один дефис, а затем удалит передние и конечные дефисы.

 var_dump(foo("The Great Book of PHP") === 'the-great-book-of-php'); var_dump(foo("The Greatest !@#$ Book of PHP") === 'the-greatest-book-of-php'); var_dump(foo("Funny title ") === 'funny-title'); 

Для этой цели можно использовать простое регулярное выражение:

 <?php function safeurl( $v ) { $v = strtolower( $v ); $v = preg_replace( "/[^a-z0-9]+/", "-", $v ); $v = trim( $v, "-" ); return $v; } echo "<br>www.mysite.com/book/12345/" . safeurl( "The Great Book of PHP" ); echo "<br>www.mysite.com/book/12345/" . safeurl( "The Greatest !@#$ Book of PHP" ); echo "<br>www.mysite.com/book/12345/" . safeurl( " Funny title " ); echo "<br>www.mysite.com/book/12345/" . safeurl( "!!Even Funnier title!!" ); ?> 

Если вы хотите разрешить только буквы, цифры и символы подчеркивания (обычные слова), вы можете сделать:

 $str = strtolower(preg_replace(array('/\W/','/-+/','/^-|-$/'),array('-','-',''),$str)); 

Он сначала заменяет любой символ без слова ( \W ) на.
Затем он заменяет любой последовательный - с одним -
Затем он удаляет любые ведущие или завершающие - .

Рабочая ссылка

Этот код исходит от помощника URL-адреса CodeIgniter . Это должно сделать трюк.

 function url_title($str, $separator = 'dash', $lowercase = FALSE) { if ($separator == 'dash') { $search = '_'; $replace = '-'; } else { $search = '-'; $replace = '_'; } $trans = array( '&\#\d+?;' => '', '&\S+?;' => '', '\s+' => $replace, '[^a-z0-9\-\._]' => '', $replace.'+' => $replace, $replace.'$' => $replace, '^'.$replace => $replace, '\.+$' => '' ); $str = strip_tags($str); foreach ($trans as $key => $val) { $str = preg_replace("#".$key."#i", $val, $str); } if ($lowercase === TRUE) { $str = strtolower($str); } return trim(stripslashes($str)); } 

Замените специальные символы для белых пространств, а затем замените белые пробелы на «-». str_replace?

Используйте замену регулярных выражений, чтобы удалить все символы без слова. Например:

str_replace ('[^ a-zA-Z] +', '-', $ input)

 <?php $input = " The Great Book's of PHP "; $output = trim(preg_replace(array("`'`", "`[^az]+`"), array("", "-"), strtolower($input)), "-"); echo $output; // the-great-books-of-php 

Это обрезает трейлинг-тире и не делает таких вещей, как "it's raining" -> "it-s-raining" как это обычно делают большинство решений.

Санация специальных символов не простая задача imho. Взгляните на WordPress awesome sanitize_title , также посмотрите, что это источник .

Обновление: Извините, ребята, я должен использовать каждый ответ, который не имеет отношения к ударным символам. Вы понимаете, что означает «название может содержать любой символ» ?

Обновление 2: Иди, ребята, иди! Пожалуйста, снимите меня столько, сколько сможете!

Примечание: и не удивляйтесь, когда встретите специального персонажа. Просто исключите его с str_replace!