2011-09-12 89 views
3

我正在創建一個密碼驗證工具,我希望的一個要求是防止用戶在一行中有太多字母。任何字母,包括大寫字母,都不能以3次或更多次的順序重複。在PHP中檢查重複的字母

我的方法是使用for循環遍歷密碼字符串,並在其中嵌入一些使用正則表達式的檢查。我似乎無法讓邏輯工作,這可能很簡單。下面是我的(很多)失敗的嘗試中的一個來解決這個問題:

$seqLetterCounter = 0; 
    for($i=0; $i < strlen($password); ++$i) { 
      if($password{$i} == '/([a-zA-Z])/') { 
       $seqLetterCounter++; 
      } 
      if($seqLetterCounter > $this->maxSeqLetters){ 
       $this->errors[6] = 'You have used too many sequential letters in your password. The maximum allowed is ' . $this->maxSeqLetters . '.'; 
      } 
      if($password{$i} == '/([^a-zA-Z])/') { 
       $seqLetterCounter = 0; 
      } 
     } 

$ password - 從表單中發佈的值。

$ maxSeqLetters - 保存由用戶定義的整數值的受保護變量。

errors [] - 一個數組,用於確定密碼是否通過了各種檢查。

任何人都有一些指針?

+4

是一個很好的編碼器,很懶:http://www.openwall.com/passwdqc/ – hakre

回答

11

用正則表達式非常簡單:

if (preg_match('/(\w)\1{2,}/', $password)) { 
    die("3+ repeated chars not allowed"); 
} 

搜索一個字符(\w),其存儲(()),然後看看是否是相同的字符立刻浮現之後(\1)兩次或更多次{2,}


確定...所以,如果3+字母或數字的連續組都出來了,然後嘗試

/([a-z]{3,}|[0-9]{3,})/i 

爲正則表達式來代替。搜索出現3次或更多次的任何字母([a-z])或(|)號碼([0-9]),並且以不區分大小寫的方式進行匹配(i),因此您不必擔心aAa打破比賽。

+0

太棒了。現在我真的想更多地瞭解正則表達式。 – Simone

+0

也許我應該澄清,因爲現在閱讀我的問題,我可以看到爲什麼你會發布這個答案馬克...我期待,以防止使用連續的任何字母...即「Dog123」將失敗,將「123Cat 」。 「Do12Do12」不會失敗檢查。希望澄清!我很高興你回答得太快了! :DDDDD〜 – Patrick

+0

@帕特里克:請定義「連續的字母」,根本無法匹配您最後的評論和您的問題。繼續,我開始投票結束,因爲它根本沒有幫助。 – hakre