想象一下我想要转换为小写的原始网址,所有间距都用短划线-
替换,并且所有逗号都替换为空。目前我有这个:
$pageurle = str_replace(' ', '-', $pagename);
$pageurle = strtolower($pageurle);
$pageurle = urlencode($pageurle);
有效,但不会删除逗号。当我添加这个:
$pageurle = str_replace(',', '', $pagename);
然后我删除了逗号,但所有破折号都变为+
???我该如何解决这个问题?
一般情况下,我很乐意为您提供-
@
&
或--
等字符列表或其他我很乐意从我手动删除的内容不错的网址。
答案 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');