从string中删除所有特殊字符

可能重复:
正则expression式净化(PHP)

我面对一个URL的问题,我希望能够转换标题,可以包含任何东西,并剥夺了所有的特殊字符,所以他们只有字母和数字,当然我想用连字符replace空格。

这将如何完成? 我听说过很多正则expression式(正则expression式)正在使用…

十分简单:

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. } 

更新

下面的解决scheme有一个“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); } 

上述function的基本原理(我觉得效率低下 – 以下是更好的)是, 一个不能命名的服务显然是在URL上进行拼写检查和关键字识别。

在客户的偏执狂上失去了很长一段时间之后,我发现他们并不是想象的东西 – 他们的SEO专家(我绝对不是一个)报告说,把“Viaggi经济Perù”转换成viaggi-economy-peru “ (比以前的“清洁”去掉了UTF8的字符; 波哥大成为了BogotMedellìn变成了麦德林等等)。

也有一些似乎影响结果的常见拼写错误,唯一对我有意义的解释是我们的URL被解开,单词被选出来,用来驱动上帝知道排名algorithm。 这些algorithm显然是用UTF8清理过的string进行的,所以“Perù”变成了“Per”而不是“Per”。 “每”不匹配,并把它在脖子上。

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

以前的答案

一个简单的方法:

 // Remove all characters except AZ, az, 0-9, dots, hyphens and spaces // Note that the hyphen must go last not to be confused with a range (AZ) // and the dot, being special, is escaped with \ $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”,您希望它成为永远不会给你不是永远不要20gna20give20you20up 。 你可能不需要它,但我想我会提到的可能性。

所以完成函数和testing用例一起:

 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,我使用了一个在这里find的cleanString实现。 它可以被简化,并包裹在这里的性能function。

上面的function也实现了转换为小写 – 但这是一种品味。 这样做的代码已经被注释掉了。

在这里,看看这个function:

 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('/&([az])(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, '-')); }