2009-10-30 72 views
1

我需要使用PHP來驗證用戶名,我只希望他們使用的字母數字,以及破折號(-),下劃線(_)和時間(.PHP正則表達式驗證

這是正確的?

preg_match("/[A-Za-z0-9_-.]/",$text); 
+1

嗨布倫丹 - 找出是否正確的最簡單方法就是實際測試它。 – 2009-10-30 09:33:49

回答

4

不,它不是(雖然,我想你已經懷疑過,否則你不會問)。 :)

定義字符組時,短劃線用於定義範圍,就像您做的那樣A-Z表示A和Z之間的所有字符。但是,您也可以使用_-.,表示_和之間的所有字符。 (我不知道這是什麼,但你可以在ASCII表中查找它)。爲了允許匹配字符組中的破折號,它被放置在任何不能被解釋爲字符範圍的地方,通常是第一個或最後一個字符(但請參閱其他創意方式的註釋;))。

preg_match("/^[A-Za-z0-9_.-]+$/",$text); 

正如評論指出的那樣,你需要錨太,以確保有匹配的範圍之外沒有charachters(這是什麼^,它匹配開頭的字符串,和$,這匹配字符串的結尾,是)。您還需要確保您可以匹配多個字符。所以在那裏添加一個+(或者如果你想允許空字符串),意思是一個或多個字符。

HTH

+0

@roe - 如果你逃脫它也會工作 - '\ -'? – 2009-10-30 09:39:29

+0

破折號也可以轉義:'/ [A-Za-z0-9 _ \ - 。] /',或者放置在開始:'/ [ - A-Za-z0-9 _。] /'之間或者範圍:'/ [AZa-z0-9 _。] /'以匹配文字'-'。 – 2009-10-30 09:40:06

+0

@Bart:好點.. – falstro 2009-10-30 09:42:11

0

您需要在開始的結束錨定模式,現在它會$文本,只要有一隻有效的字符,其餘爲無效匹配。使用這個:

if (preg_match('/^[\w.-]+$/', $text)) { /* valid */ } 

\ w是與[0-9A-Za-z_]相同的東西。另一種方法是去反轉模式並搜索任何無效字符,並檢查沒有匹配:

if (!preg_match('/[^\w.-]/', $text)) { /* valid */ }