Возможный дубликат:
Регуляция регулярных выражений (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, '-')); }