2013-05-13 32 views
0

我用這對一個需要8-20密碼字符長,只有數字,字母和@#$%符號:的preg_match密碼總是錯誤

if (!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[[email protected]#$%]{8, 20}$/', $_POST['password'])) { 
    $errors[] = true; 
    $_SESSION['error'] .= '<div class="messages status_red">Password must be 8-20 long, A-Z, 0-9, [email protected]#$% only.</div>'; 
} 

但是不管我符合標準或不符合我仍然返回一個錯誤。

我也沒有看到任何error_reporting消息。

任何想法可能是什麼原因呢?

+7

「只有數字,字母和!@#$%」---這是一個*愚蠢*限制。不要限制用戶在他們的密碼中使用什麼字符 – zerkms 2013-05-13 23:26:08

+0

您需要轉義'$'... [A-Za-z])[0-9A-Za-z!@#\ $%] – 2013-05-13 23:26:21

+0

@Eugen Rieck:字符集中不應該有'$' – zerkms 2013-05-13 23:26:39

回答

3

請勿在{8, 20}中放置空間。它應該是{8,20}

5

的問題是在{8, 20}的空間中,其保持它被識別爲{分鐘,最大}量詞。但我不知道爲什麼你用積極的lookahead等來複雜化事物;因爲這應該做的伎倆簡單的東西:

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

編輯補充:這將是更好的安全習慣,以允許任何字符在所有的密碼。如果他們可以鍵入它,讓他們使用它 - 並且它是在你能夠處理它,而不會與SQL注入或類似的衝突。 (你不要在你的數據庫中存儲密碼無論如何,對不對?)

如果你希望要求,以一定量的性格的多樣性,鼓勵更強的密碼 - 例如,要求每個字母至少一個,數字,也沒有 - 那麼你可以做這樣的事情。在這裏,用超前的表示字母,數字,也不-的最上方可以以任意順序在密碼發生:

preg_match('/(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])/', $_POST['password']) 

你可以嘗試獲得長度要求爲正則表達式,也但我會單獨檢查長度 - 在這裏再次,我會有一個最小值,但沒有最大值。 (由於密碼永遠不會被存儲,但只能進行校驗和,所以更長的密碼不應該產生額外的存儲開銷,但是如果你遇到了由於某種原因需要限制長度的情況,可以嘗試選擇數百字符範圍而不是數十個字符範圍。)