从字符串中移除所有特殊字符

我面临着一个问题与url,我想能够转换标题,可以包含任何东西,并有他们剥离所有特殊字符,所以他们只有字母和数字,当然,我想用连字符替换空格。

如何做到这一点呢?我听说过很多关于正则表达式的使用…

1039713 次浏览

这应该是你想要的:

function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.


return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.
}

用法:

echo clean('a|"bc!@£de^&$f g');

将输出:abcdef-g

编辑:

嘿,只是一个快速的问题,我如何防止多个连字符相邻?把它们换成1?

function clean($string) {
$string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.
$string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.


return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one.
}

这里,看看这个函数:

function seo_friendly_url($string){
$string = str_replace(array('[\', \']'), '', $string);
$string = preg_replace('/\[.*\]/U', '', $string);
$string = preg_replace('/&(amp;)?#?[a-z0-9]+;/i', '-', $string);
$string = htmlentities($string, ENT_COMPAT, 'utf-8');
$string = preg_replace('/&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);/i', '\\1', $string );
$string = preg_replace(array('/[^a-z0-9]/i', '/[-]+/') , '-', $string);
return strtolower(trim($string, '-'));
}

更新

下面的解决方案有一个“SEO友好”版本:

function hyphenize($string) {
$dict = array(
"I'm"      => "I am",
"thier"    => "their",
// Add your own replacements here
);
return strtolower(
preg_replace(
array( '#[\\s-]+#', '#[^A-Za-z0-9. -]+#' ),
array( '-', '' ),
// the full cleanString() can be downloaded from http://www.unexpectedit.com/php/php-clean-string-of-utf8-chars-convert-to-similar-ascii-char
cleanString(
str_replace( // preg_replace can be used to support more complicated replacements
array_keys($dict),
array_values($dict),
urldecode($string)
)
)
)
);
}


function cleanString($text) {
$utf8 = array(
'/[áàâãªä]/u'   =>   'a',
'/[ÁÀÂÃÄ]/u'    =>   'A',
'/[ÍÌÎÏ]/u'     =>   'I',
'/[íìîï]/u'     =>   'i',
'/[éèêë]/u'     =>   'e',
'/[ÉÈÊË]/u'     =>   'E',
'/[óòôõºö]/u'   =>   'o',
'/[ÓÒÔÕÖ]/u'    =>   'O',
'/[úùûü]/u'     =>   'u',
'/[ÚÙÛÜ]/u'     =>   'U',
'/ç/'           =>   'c',
'/Ç/'           =>   'C',
'/ñ/'           =>   'n',
'/Ñ/'           =>   'N',
'/–/'           =>   '-', // UTF-8 hyphen to "normal" hyphen
'/[’‘‹›‚]/u'    =>   ' ', // Literally a single quote
'/[“”«»„]/u'    =>   ' ', // Double quote
'/ /'           =>   ' ', // nonbreaking space (equiv. to 0x160)
);
return preg_replace(array_keys($utf8), array_values($utf8), $text);
}

上述函数的基本原理(我发现道路效率很低-下面的一个更好)是一个不能被命名的服务显然在url上运行拼写检查和关键字识别。

在对客户的偏执失去了很长一段时间后,我发现他们毕竟是想象的事情——他们的SEO专家(我绝对不是一个)报告说,例如,将“Viaggi Economy Perù”转换为viaggi-economy-peru“表现得更好”比viaggi-economy-per(之前的“清理”删除了UTF8字符;波哥大变成了bogot麦德林变成了medelln等等)。

还有一些常见的拼写错误似乎影响了结果,对我来说唯一有意义的解释是,我们的URL被解压缩了,单词被单独挑选出来,并被用来驱动天知道什么排名算法。这些算法显然是用utf8清洗过的字符串输入的,所以“Perù”变成了“Peru”而不是“Per”。“Per”不匹配,有点像在脖子上。

为了保持UTF8字符并替换一些拼写错误,下面更快的函数变成了上面更准确的(?)函数。$dict当然需要手工定制。

以前的回答

一个简单的方法:

// Remove all characters except A-Z, a-z, 0-9, dots, hyphens and spaces
// Note that the hyphen must go last not to be confused with a range (A-Z)
// and the dot, NOT being special (I know. My life was a lie), is NOT escaped


$str = preg_replace('/[^A-Za-z0-9. -]/', '', $str);


// Replace sequences of spaces with hyphen
$str = preg_replace('/  */', '-', $str);


// The above means "a space, followed by a space repeated zero or more times"
// (should be equivalent to / +/)


// You may also want to try this alternative:
$str = preg_replace('/\\s+/', '-', $str);


// where \s+ means "zero or more whitespaces" (a space is not necessarily the
// same as a whitespace) just to be sure and include everything

注意,你可能必须首先urldecode() URL,因为%20和+实际上都是空格——我的意思是,如果你有“Never%20gonna%20give%20you%20up”,你想让它变成Never-gonna-give-you-up,而不是Never20gonna20give20you20up。你可能不需要它,但我想我应该提到这种可能性。

所以完成的函数和测试用例:

function hyphenize($string) {
return
## strtolower(
preg_replace(
array('#[\\s-]+#', '#[^A-Za-z0-9. -]+#'),
array('-', ''),
##     cleanString(
urldecode($string)
##     )
)
## )
;
}


print implode("\n", array_map(
function($s) {
return $s . ' becomes ' . hyphenize($s);
},
array(
'Never%20gonna%20give%20you%20up',
"I'm not the man I was",
"'Légeresse', dit sa majesté",
)));




Never%20gonna%20give%20you%20up    becomes  never-gonna-give-you-up
I'm not the man I was              becomes  im-not-the-man-I-was
'Légeresse', dit sa majesté        becomes  legeresse-dit-sa-majeste

为了处理UTF-8,我使用了在线找到的cleanString实现(链接中断,但所有不太深奥的UTF8字符的剥离副本位于答案的开头;如果需要,添加更多字符也很容易),它将UTF8字符转换为普通字符,从而尽可能地保留单词“look”。为了提高性能,可以将其简化并包装在函数中。

上面的函数还实现了转换为小写字母的功能——但这只是一个尝试。这样做的代码已被注释掉。