Каков наилучший способ очистки строки для размещения в URL, например, имени вопроса в SO? - PullRequest
6 голосов
/ 12 февраля 2009

Я хочу создать строку URL, аналогичную той, которую SO использует для ссылок на вопросы. Я не смотрю на переписывание URL (mod_rewrite). Я смотрю на создание ссылки на странице.

Пример: название вопроса:

Is it better to use ob_get_contents() or $text .= ‘test’;

URL в конечном итоге будет:

/165271/luchshe-ispolzovat-obgetcontents-ili-text-test

Интересующая меня часть:

is-it-better-to-use-obgetcontents-or-text-test

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

$str = urlencode(
    strtolower(
    str_replace('--', '-', 
    preg_replace(array('/[^a-z0-9 ]/i', '/[^a-z0-9]/i'), array('', '-'), 
    trim($urlPart)))));

Так в основном:

  1. отделка
  2. заменить любой не алфавитно-цифровой плюс пробел ничем
  3. затем замените все, что не буквенно-цифровое, тире
  4. заменить - на -.
  5. strtolower()
  6. urlencode() - вероятно, не нужно, но просто для хорошей меры.

1 Ответ

5 голосов
/ 12 февраля 2009

Как вы уже указали, в этом случае urlencode () не нужен, как и trim (). Если я правильно понимаю, шаг 4 состоит в том, чтобы избежать нескольких штрихов подряд, но он не предотвратит более двух штрихов. С другой стороны, тире, соединяющие два слова (как в «крупномасштабном»), будут удалены вашим решением, пока они сохраняются в SO.

Я не уверен, что это действительно лучший способ сделать это, но вот мое предложение:

$str = strtolower( 
  preg_replace( array('/[^a-z0-9\- ]/i', '/[ \-]+/'), array('', '-'), 
  $urlPart ) );

Итак:

  1. удалить любой символ, который не является ни пробелом, ни тире, ни буквенно-цифровым
  2. заменить любое последовательное количество пробелов или тире одним тире
  3. strtolower ()
...