2012-01-10 178 views
1

我瘋狂地用正則表達式綠色。這是我想要實現的:我想要求一個8位字符的密碼,它允許大寫和小寫字母,數字和!@#$%^ & * -_個字符。以下是我已經不似乎工作:正則表達式和preg_match()

preg_match('([[email protected]#$%^&*]{8,})', $password)

我缺少的東西真的很明顯?

更新:是的,我錯過了一些非常明顯的東西 - 左括號[。但是,當我使用像單引號或括號這樣的字符時,它仍然會返回true。 (這是我試圖避免的。)

+1

這是您的實際正則表達式嗎?你錯過了第一個括號,你的第一個範圍應該是A-Z – 2012-01-10 02:10:23

+1

你限制字符集而不是允許所有字符的任何特定原因? – FtDRbwLXw6 2012-01-10 02:11:13

+0

當看到密碼字符集的任何限制時,我總是感到驚訝。爲什麼我不在密碼中使用','(逗號)?! – zerkms 2012-01-10 02:13:34

回答

3

基本上你錯過這裏的開口[字符組支架:

   ↓ 
preg_match('([[email protected]#$%^&*()]{8,})', $password) 

而且你也應該使用delimiters。在括號將表現爲這樣的,但最好使用不同的配對,以避免與捕獲組歧義:

preg_match('/^([[email protected]#$%^&*()]{8,})$/', $password) 

這也增加了啓動^,結束$斷言整個字符串相匹配。

+2

另外,'A-z'應該是'A-Z',而連字符('-')應該被轉義:'\ -'。 – FtDRbwLXw6 2012-01-10 02:16:37

+1

錯過了案例不匹配。非偶然的連字符會偶然發生*,因爲它遵循有效的範圍,它不能是範圍本身的一部分。 (雖然可能是PCRE的一個特點。) – mario 2012-01-10 02:18:52

+0

非常感謝。它的工作,但我仍然有點不確定爲什麼。開始和結束的斷言是做什麼的? (請原諒我的無知) – drewwyatt 2012-01-10 02:21:46

0

這可能更容易分解成單獨的規則。即一個規則來檢查密碼是否至少8個字符長,另一個檢查大寫,另一個檢查大寫,另一個小寫等。

此外,它看起來像正則表達式中有一些特殊字符沒有任何轉義。例如,除了一些特殊情況,*字符在正則表達式中具有特殊含義。它可能需要轉義\*或括號內[*]