2010-12-05 71 views
0

我想使這個正則表達式也支持空格,但是(不是在談論\n\r)。改進此正則表達式來支持空格

preg_match('/^[a-zA-Z0-9_-]+$/', $text); 

當我嘗試這樣做:

preg_match('/^[a-zA-Z0-9_- ]+$/', $text); 

它返回:編譯失敗:範圍出的順序字符類偏移量13

Recaping一切,它應該只匹配a-z & A-Z & 0-9 & - & _ & space

感謝

回答

4

使用

preg_match('/^[a-zA-Z0-9_ -]+$/', $text); 

否則([_- ])將被理解爲範圍

0

你需要躲避最後連字符:

preg_match('/^[a-zA-Z0-9_\- ]+$/', $text); 
0

使用\ S爲空白

文檔中發現here

+0

這應該如何提供幫助? – 2010-12-05 23:26:15

0

我相信,你的正則表達式字符串評估下劃線衝刺空間「_-」的範圍。嘗試逃離破折號。

1

這是因爲你有一個-之前的空間形成範圍_-,這是非法的,因爲空間按字典順序小於_。要解決此問題,請在空格後移動-,以便您不再構成範圍從-

preg_match('/^[a-zA-Z0-9_ -]+$/', $text); 

還要考慮使用\s匹配任何空白字符,包括空格,製表符,換行符和cariage回報。 PS:很高興你沒有合法範圍,這可能是一個令人討厭的錯誤。 :)

+2

+1按字典順序排列 – Ryan 2010-12-05 19:08:12

1

[a-zA-Z0-9_- ]_- 被解釋爲字符範圍從_低線,0x5F的)到 SPACE,爲0x20)。但由於_來自 ,字符範圍_- 無效。

既然你不希望這樣的字符範圍,您可能需要逃避-以便它不會被解釋爲字符範圍:

[a-zA-Z0-9_\- ] 

或重新安排的角色,這樣的-不會被解釋爲字符範圍指示器,就像在字符類別的開頭或結尾處緊接着另一個字符範圍或右側時那樣:

[a-z-A-Z0-9_ ] 
[a-zA-Z-0-9_ ] 
[a-zA-Z0-9-_ ] 
[-a-zA-Z0-9_ ] 
[a-zA-Z0-9_ -] 
+0

儘管您的所有解決方案都是正確的,但我認爲僅僅因爲可以給予人們很多選擇是明智的。此外,如果在範圍*成語旁邊的*文字連字符是不太可讀的IMO,並且不能保證適用於所有正則表達式。只是我的2分。 – 2010-12-05 23:42:16