2013-05-13 111 views
0

這是正則表達式:JavaScript的正則表達式?

$("#newpassword").keyup(function(e) { 
    var htm = ""; 
    var pass = this.value; 
    var length = this.value.length; 

    if (pass) { 
    var score = 0; 
    if(length >= 8 && length <= 16) { //PASSWORD MIN/MAX NUMBER OF CHARACTERS 

     var upper = /[A-Z]/; 
     var lower = /[a-z]/; 

     var number = /^[0-9]+$/; //PATTERN FOR NUMBERS 
     var schar = /[[email protected]#$%^&*?_~+-=<>]/; 

     //LOOPS THROUGH PASSWORD TO CHECK FOR AT LEAST ONE OF EACH PATTERN 
     for (i = 0; i < length; i++) { 
     if (pass.substr(i, 1).match(upper)) { 
      var uletters = true; 
      score ++;  
      //AT LEAST ONE LETTER EXISTS 
     } 
     if(pass.substr(i,1).match(lower)) { 
      var lletters = true; 
      score++; 
      //AT LEAST ONE LETTER EXISTS 
     } 
     if(pass.substr(i,1).match(schar)) { 
      var schar = true; 
      score++; 
     } 
     if(pass.substr(i, 1).match(number)) { 
      var numbers = true; 
      var schar = false; 
      //AT LEAST ONE NUMBER EXISTS 
      score++; 
     } 
     } 
    } 
    } 
}); 

的任何兩個條件爲真意味着密碼是好的,但上面的代碼if(numbers == true && schar == true)用戶類型只數顯示密碼確定。

請幫我解決我的代碼中存在的問題。

+8

如果您花時間格式化問題以便閱讀,它可以幫助您更快地獲得更好的答案。發佈它,使代碼縮進的方式沒有很好的理由不會這樣做。此外,你的代碼是不完整的(語法錯誤,至少缺少三個'}')。我打算爲您清理它,但我不想引入誤導縮進。 – 2013-05-13 07:06:24

回答

0

您可以使用RegExp.test()或RegExp.exec()來查找字符串中的正則表達式匹配項,而不是自己迭代字符。

function validatePwd (pwd) { 
    if (pwd.length < 8) 
     return false; 
    if (pwd.length > 16) 
     return false; 

    var upperPatt = /[A-Z]/; 
    var lowerPatt = /[a-z]/; 
    var numberPatt = /[0-9]/; // FIXED -- this is a better pattern for numbers. 
    var scharPatt = /[[email protected]#$%^&*?_~+-=<>]/; 

    score = 0; 
    if (upperPatt.test(pwd)) 
     score++; 
    if (lowerPatt.test(pwd)) 
     score++; 
    if (numberPatt.test(pwd)) 
     score++; 
    if (specialPatt.test(pwd)) 
     score++; 

    // don't make it too hard for the poor user, please.. 
    // -- they have to type all this horrible rubbish. 
    if (score < 3) {  
     return false; 
    } 

    // OK. 
    return true; 
} 
+0

hai,上面的代碼在數字和字符上工作正常,但用戶類型數字顯示得分值爲2. numberpatt和specialpatt.anybody plz中的問題是什麼,幫助我。我想不帶空格。 – user2293163 2013-05-14 06:18:09

+0

我認爲數字模式(你最初給出的)被打破了。無論如何請回答+1。 – 2013-05-14 08:37:57

1

你並不需要遍歷密碼的每個字符,只要做到以下幾點:

score += upper.test(password)?1:0; 
score += lower.test(password)?1:0; 
score += number.test(password)?1:0; 
score += schar.test(password)?1:0; 

test返回TRUE或FALSE)和事後檢查評分。

一般來說,建議不要對用戶密碼限制太大。如果他們被告知他們的密碼應該是什麼樣子,它會嚴重損害用戶體驗。儘管如此,你可以推薦它。 (例如顯示一個欄:弱(紅色) - 強(綠色)密碼,這比用任何錯誤信息騷擾用戶更有動力。)讓他們通過2分和更高的分數。

+0

+1用於密碼推薦! – 2013-05-13 07:59:10

+0

'score + = upper.test(密碼)?1:0;'可以縮短爲'score + = + upper.test(密碼)';甚至一元+也是不必要的。所以你的答案可以編碼爲'score + = upper.test(password)+ lower.test(password)+ number.test(password)+ schar.test(password);' – HBP 2013-05-13 08:03:41

+1

@HBP當然你可以做一個任意的代碼打高爾夫球的數量。但是,您只能編寫一次代碼,但至少要讀取10次。我總是喜歡可讀性而不是緊湊性。每個讓你覺得超過必要的LOC可能太混亂了(就像你最後一個例子)。此外,我不會使用類型強制來進行這麼大的擴展。總是想想你必須重讀你的代碼的可憐的同事。 ;) – Christoph 2013-05-13 08:24:29