Удалите все специальные символы из строки

Возможный дубликат:
Регуляция регулярных выражений (PHP)

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

Как это будет сделано? Я слышал много о регулярных выражениях (regex), которые используются …

Очень просто:

function clean($string) { $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. } 

Применение:

 echo clean('a|"bc!@£de^&$f g'); 

Вывод: abcdef-g

Редактировать:

Эй, просто быстрый вопрос, как я могу предотвратить множественные дефисы рядом друг с другом? и заменить их на 1?

 function clean($string) { $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one. } 

Обновить

В приведенном ниже решении есть версия, оптимизированная для SEO:

 function hyphenize($string) { $dict = array( "I'm" => "I am", "thier" => "their", // Add your own replacements here ); return strtolower( preg_replace( array( '#[\\s-]+#', '#[^A-Za-z0-9\. -]+#' ), array( '-', '' ), // the full cleanString() can be downloaded from http://www.unexpectedit.com/php/php-clean-string-of-utf8-chars-convert-to-similar-ascii-char cleanString( str_replace( // preg_replace can be used to support more complicated replacements array_keys($dict), array_values($dict), urldecode($string) ) ) ) ); } function cleanString($text) { $utf8 = array( '/[áàâãªä]/u' => 'a', '/[ÁÀÂÃÄ]/u' => 'A', '/[ÍÌÎÏ]/u' => 'I', '/[íìîï]/u' => 'i', '/[éèêë]/u' => 'e', '/[ÉÈÊË]/u' => 'E', '/[óòôõºö]/u' => 'o', '/[ÓÒÔÕÖ]/u' => 'O', '/[úùûü]/u' => 'u', '/[ÚÙÛÜ]/u' => 'U', '/ç/' => 'c', '/Ç/' => 'C', '/ñ/' => 'n', '/Ñ/' => 'N', '/–/' => '-', // UTF-8 hyphen to "normal" hyphen '/[''‹›‚]/u' => ' ', // Literally a single quote '/[“”«»„]/u' => ' ', // Double quote '/ /' => ' ', // nonbreaking space (equiv. to 0x160) ); return preg_replace(array_keys($utf8), array_values($utf8), $text); } 

Обоснование вышеуказанных функций (которое я считаю неэффективным, а другое ниже) заключается в том, что служба, которая не должна быть названа, по- видимому, выполняла проверки орфографии и распознавания ключевых слов в URL-адресах.

Потеряв долгое время на паранойях клиента, я обнаружил, что они вообще не представляют себе ничего общего – их эксперты по SEO (я определенно не один) сообщили, что, скажем, преобразование «Viaggi Economy Perù» в viaggi-economy-peru », вел себя лучше ", чем viaggi-economy-per (предыдущая« чистка »удаляла символы UTF8, Bogotà стал боготом , Medellìn стал медальмом и т. д.).

Были также некоторые распространенные ошибки, которые, казалось, влияли на результаты, и единственное объяснение, которое имело для меня смысл, заключается в том, что наш URL-адрес распаковывается, слова выделены и используются для того, чтобы Бог знал, какие алгоритмы ранжирования. И эти алгоритмы, по-видимому, были снабжены строками, очищенными UTF8, так что «Perù» стал «Перу» вместо «Пер». «Пер» не соответствовал, а вид взял его в шею.

Чтобы сохранить символы UTF8 и заменить некоторые орфографические ошибки, более быстрая функция ниже стала более точной (?) Функцией выше. Разумеется, $dict нужно подбирать вручную.

Предыдущий ответ

Простой подход:

 // Remove all characters except AZ, az, 0-9, dots, hyphens and spaces // Note that the hyphen must go last not to be confused with a range (AZ) // and the dot, being special, is escaped with \ $str = preg_replace('/[^A-Za-z0-9\. -]/', '', $str); // Replace sequences of spaces with hyphen $str = preg_replace('/ */', '-', $str); // The above means "a space, followed by a space repeated zero or more times" // (should be equivalent to / +/) // You may also want to try this alternative: $str = preg_replace('/\\s+/', '-', $str); // where \s+ means "zero or more whitespaces" (a space is not necessarily the // same as a whitespace) just to be sure and include everything 

Обратите внимание, что вам может потребоваться сначала urldecode() URL-адрес, так как% 20 и + оба являются пробелами – я имею в виду, если у вас есть «Never% 20gonna% 20give% 20you% 20up», вы хотите, чтобы он стал Never-gonna-give -у-вверх, а не Never20gonna20give20you20up . Возможно, вам это не понадобится, но я подумал, что упомянул бы о возможности.

Таким образом, законченная функция вместе с тестовыми примерами:

 function hyphenize($string) { return ## strtolower( preg_replace( array('#[\\s-]+#', '#[^A-Za-z0-9\. -]+#'), array('-', ''), ## cleanString( urldecode($string) ## ) ) ## ) ; } print implode("\n", array_map( function($s) { return $s . ' becomes ' . hyphenize($s); }, array( 'Never%20gonna%20give%20you%20up', "I'm not the man I was", "'Légeresse', dit sa majesté", ))); Never%20gonna%20give%20you%20up becomes never-gonna-give-you-up I'm not the man I was becomes im-not-the-man-I-was 'Légeresse', dit sa majesté becomes legeresse-dit-sa-majeste 

Для обработки UTF-8 я использовал здесь реализацию cleanString . Он может быть упрощен и включен внутри функции здесь для повышения производительности.

Функция выше также реализует преобразование в нижний регистр – но это вкус. Код для этого был прокомментирован.

Здесь вы можете проверить эту функцию:

 function seo_friendly_url($string){ $string = str_replace(array('[\', \']'), '', $string); $string = preg_replace('/\[.*\]/U', '', $string); $string = preg_replace('/&(amp;)?#?[a-z0-9]+;/i', '-', $string); $string = htmlentities($string, ENT_COMPAT, 'utf-8'); $string = preg_replace('/&([az])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);/i', '\\1', $string ); $string = preg_replace(array('/[^a-z0-9]/i', '/[-]+/') , '-', $string); return strtolower(trim($string, '-')); }