urlencode:如何删除逗号等特定字符?

时间:2011-03-09 02:55:58

标签: php string urlencode

想象一下我想要转换为小写的原始网址,所有间距都用短划线-替换,并且所有逗号都替换为空。目前我有这个:

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

有效,但不会删除逗号。当我添加这个:

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

然后我删除了逗号,但所有破折号都变为+ ???我该如何解决这个问题?

一般情况下,我很乐意为您提供- @ &--等字符列表或其他我很乐意从我手动删除的内容不错的网址。

3 个答案:

答案 0 :(得分:4)

这里的问题是你引用了$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));

答案 1 :(得分:2)

你真的不应该试图列出所有禁用的字符 - 特别是如果它进入一个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”)。

答案 2 :(得分:2)

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');