urlencode: как удалить определенные символы, такие как запятые? - PullRequest
0 голосов
/ 09 марта 2011

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

$pageurle = str_replace(' ', '-', $pagename);
$pageurle = strtolower($pageurle);
$pageurle = urlencode($pageurle);

, который работает, но не удаляет запятые.Когда я добавляю это:

$pageurle = str_replace(',', '', $pagename);

, тогда я получаю удаленную запятую, но все тире становятся + ???как мне решить это?

В общем, я был бы рад иметь список символов, таких как - @ & или -- или другие вещи, которые я бы с удовольствием удалил вручную из моих хороших URL-адресов.*

Ответы [ 3 ]

4 голосов
/ 09 марта 2011

Проблема в том, что вы ссылаетесь на $pagename дважды.Вы должны ссылаться на $pageurle, если хотите сделать дальнейшую замену.В противном случае ваша первая замена будет перезаписана.- не заменяется +, скорее, пробелы от оригинала $pagename.

Обратите внимание, что str_replace() также может принимать массивы.Таким образом, вы должны иметь возможность поместить список сущностей, которые вы хотите заменить, в массив, и список их замен в другом, и вызвать str_replace(), и он сделает все это за один раз.См http://php.net/manual/en/function.str-replace.php

$search=array(' ', '--');
$replace=array('-', 'somethingelse');

$pageurle=urlencode(str_replace($search, $replace, $pagename));
2 голосов
/ 09 марта 2011
function slugify($text)
{
  // we don't want "amp" and similar in our urls
  $text = htmlspecialchars_decode($text, ENT_QUOTES);

  // replace non letter or digits by -
  $text = preg_replace('~[^\\pL\d]+~u', '-', $text);

  // trim
  $text = trim($text, '-');

  // transliterate
  $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

  // lowercase
  $text = strtolower($text);

  // remove unwanted characters
  $text = preg_replace('~[^-\w]+~', '', $text);

  if (empty($text))
  {
    return 'n-a';
  }

  return $text;
}

Иногда iconv не работает должным образом. Если это так, для установки локали следует исправить:

setlocale(LC_ALL, 'en_US.utf8'); 
2 голосов
/ 09 марта 2011

Вы действительно не должны пытаться составить список всех запрещенных символов, особенно - особенно если это идет в URL:

$pageurle = iconv('UTF-8', 'ASCII//TRANSLIT', $pagename);
$pageurle = preg_replace("/[^a-zA-Z0-9\/_| -]/", '', $pageurle);
$pageurle = strtolower(trim($pageurle, '-'));
$pageurle = preg_replace("/[\/_| -]+/", '-', $pageurle);

Вышеприведенное должно тщательно очистить вашу строку исделайте его дружественным к URL, сохраняя при этом посторонние символы (т.е. IE преобразует «С» в «N»).

...