2011-05-01 29 views
1

我有應該符合以下條件使用正則表達式來驗證密碼

  1. 應具有至少一個字母和一個數字密碼字段
  2. 應該具有5最小長度和最大長度20

此外,我想知道所有語言的正則表達式是否相同?

正則表達式(假設我只有一個基本的理解)開始的好教程的鏈接也很好。

謝謝

回答

5

最小值和最大值只使用strlen

的一個字符和一個數字,我會用preg_match

$len = strlen($string); 

if ($len < 5) { 
    // too short 
}elseif ($len > 20) { 
    // too long. 
}elseif (!preg_match('#[0-9]#', $string)) { 
    // does not contain a digit 
}elseif (!preg_match('#[a-z]#i', $string)) { 
    // does not have a character 
} 

我喜歡打破礦山出多張支票,所以我可以告訴正是缺少用戶。有些人更喜歡將它捆綁成一個。

+0

我喜歡把它拆分的想法,如果沒有達到投票限額,它會投你一票。 – alex 2011-05-01 14:17:50

+0

不用擔心:)我只是喜歡這種方式,因爲當您想使用AJAX來顯示實時錯誤消息時,它更容易。 – 2011-05-01 14:19:20

+0

你認爲這是好方法嗎?我個人喜歡將代碼捆綁到一個..我認爲這樣可以整潔。 – 2011-05-01 14:25:47

4

正則表達式是一個非常好的密碼驗證工具。多條規則可以使用向前斷言應用(其中使用AND邏輯工作)從字符串的開頭應用,像這樣:

$re = '/ 
    # Match password with 5-20 chars with letters and digits 
    ^    # Anchor to start of string. 
    (?=.*?[A-Za-z]) # Assert there is at least one letter, AND 
    (?=.*?[0-9])  # Assert there is at least one digit, AND 
    (?=.{5,20}\z) # Assert the length is from 5 to 20 chars. 
    /x'; 
if (preg_match($re, $text)) { 
    // Good password 
} 

這裏的JavaScript等價的:

var re = /^(?=.*?[A-Za-z])(?=.*?[0-9])(?=.{5,20}$)/; 
if (re.test(text)) { 
    // Good password 
} 

好有關使用正則表達式進行密碼驗證的文章是:Password Strength Validation with Regular Expressions。 (雖然他的最終表達方式在開始時包含了一個錯誤的小星星 - 請參閱我在他的博客上的評論)。

還要注意,正則表達式的語法在不同的語言中有所不同(但大多數都在收斂在Perl語法上)。如果你真的想知道正則表達式(在新:「我知道功夫」意義上),那麼沒有比坐下來更好的方式閱讀:Mastering Regular Expressions (3rd Edition)通過Jeffrey Friedl。

附加信息:一個很好的參數可以使密碼驗證分成多個測試,它允許代碼爲每種類型的驗證錯誤提供特定的錯誤消息。這裏提供的答案旨在演示使用一個正則表達式驗證多個規則的正確方法。

快樂的regexing!

+0

+1很好的正則表達式 – alex 2011-05-02 00:01:40