Я столкнулся с проблемой с URL-адресами, я хочу иметь возможность конвертировать титры, которые могут содержать что угодно, и лишить их всех специальных символов, чтобы у них были только буквы и цифры, и, конечно, я хотел бы заменить пробелы дефисом.
Как это сделать? Я много слышал о регулярных выражениях (регулярном выражении)...
Ответ 2
Обновление
Приведенное ниже решение имеет "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; Богота стала богот, Медельин стала медель и т.д.).
Были также некоторые типичные ошибки в написании, которые, казалось, влияли на результаты, и единственное объяснение, которое имело смысл для меня, состоит в том, что наш URL распаковывался, слова выделялись и использовались, чтобы заставить Бога знать, какие алгоритмы ранжирования. И эти алгоритмы, очевидно, были снабжены очищенными UTF8 строками, так что "Perù" стал "Peru" вместо "Per". "Пер" не совпал и как бы взял его в шею.
Чтобы сохранить символы UTF8 и заменить некоторые орфографические ошибки, приведенная ниже более быстрая функция стала более точной (?) Функцией выше. $dict
, конечно, нужно адаптировать вручную.
Предыдущий ответ
Простой подход:
// Remove all characters except A-Z, a-z, 0-9, dots, hyphens and spaces
// Note that the hyphen must go last not to be confused with a range (A-Z)
// and the dot, NOT being special (I know. My life was a lie), is NOT escaped
$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 и + оба на самом деле пробелы - я имею в виду, если у вас есть "Никогда %20gonna %20give %20you %20up", вы хотите, чтобы он стал Никогда. собираюсь сдаться, а не 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
, найденную в сети (ссылка не работает с тех пор, но урезанная копия со всеми не слишком эзотерическими символами UTF8 находится в начале ответа; ее также легко добавить больше символов к нему, если вам нужно), который преобразует символы UTF8 в обычные символы, сохраняя, таким образом, слово "выглядеть" в максимально возможной степени. Это можно упростить и обернуть внутри функции для повышения производительности.
Функция выше также реализует преобразование в нижний регистр - но это на вкус. Код для этого был закомментирован.