2010-11-17 68 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空白,包括空格和所有非字母數字字符中的一個或以上次數的+匹配塊