2010-11-17 41 views
6

我试图消除一切不是字母,或者是一个_空间:去掉空格以及任何不字母

$filename = preg_replace("([^a-zA-Z0-9]|^\s)", "_", $filename); 

什么我错在这里做什么,它似乎并没有工作。我尝试了几种正则表达式组合......(我通常不是很明亮)。

+0

我稍微confused--你想用“_”还是不用?来代替空格? – climbage 2010-11-17 23:57:56

+0

好吧,你设法忽略了很多字符:''unichars -a'[\ p {Alpha} \ p {Number}]''[^ a-zA-Z0-9]'| wc -l' == 14717'。不是一个好地方开始。 – tchrist 2010-11-18 00:03:10

+0

你应该把'\ s'放在方括号中。否则,'^ \ s'仅仅匹配主题开始处的空格。另外使用'/../'作为括号,圆括号仅用于捕获。 – mario 2010-11-18 00:04:49

回答

11

试试这个:

$filename = preg_replace("/[^a-zA-Z0-9 ]/", "_", $filename); 
+1

我建议为其他将近15000个字符忘记。 – tchrist 2010-11-18 00:03:43

+0

正则表达式不考虑有效的Unicode字符 – stillstanding 2010-11-18 02:17:42

0

尝试

$filename = preg_replace("/[a-zA-Z0-9]|\s/", "_", $filename); 
+0

哇。嗯,就像'\ s'在角色类外面做的事情一样?那么你忘记的数以千计的字母数字呢? – tchrist 2010-11-18 00:17:46

7
$filename = preg_replace('~[\W\s]~', '_', $filename); 

如果我理解你的问题正确,要替换任何空间(\ S)还是非字母数字(\ W)带'_'的字符。这应该没问题。请注意\ W是大写字母,而不是小写字母\ w,它可以匹配字母数字字符。

+2

'\ W'的含义因风味而异,但在PHP中它匹配任何不是ASCII字符的字符,即'[A-Za-z0-9_]'。这包括ASCII空格字符(所以'\ s'是多余的)和来自其他脚本的字母数字字符。即使重音的拉丁字母也被'\ W'视为非单词字符。 – 2010-11-18 01:34:17

2

为我的作品的解决方案是:

$filename = preg_replace('/\W+/', '_', $filename); 

\W空白,包括空格和所有非字母数字字符中的一个或以上次数的+匹配块