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

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

Пример: Имя вопроса:

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

URL-адрес заканчивается:

 http://stackoverflow.com/questions/292068/is-it-better-to-use-obgetcontents-or-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() – вероятно, не нужен, но просто для хорошей меры.

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

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

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

Так:

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