2013-05-13 91 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