2013-03-13 46 views
-1

我一直在试着做一个密码验证器。它只允许具有至少一个字母,至少一个数字和至少一个非字母数字字符的密码。
匹配至少一个字母,一个数字和一个非alphanum

我有下面其中的工作原理:

function passwordValidate(password, password_c, msg) 
{ 
    if (notEmpty(password, "Enter a password")) 
    { 
     if (password.value === password_c.value) 
     { 
      if(/\W/.test(password.value)) 
      { 
       if (/\d/.test(password.value) && /[a-zA-Z]/.test(password.value)) 
       { 
        return true; 
       } else { 
        alert(msg); 
       } 
      } else { 
       alert("Must have a special character in your password"); 
      } 
     } else { 
      alert("Passwords don't match"); 
     } 
    } 
    return false; 
} 

我最初有“password.value.match("\W|_")”,这是造成问题,所以改成了“/\W/.test(password.value)”。有谁知道我可以如何将它组合成一个正则表达式?

+0

[为什么你从不同的论坛复制别人的问题?(HTTP:// WWW。 webdeveloper.com/forum/showthread.php?273367-Need-to-match-at-least-one-letter-at-least-one-number-and-at-least-one-non-alphanum) – DMK 2013-03-22 15:16:14

回答

1

你可以使用断言。
断言子模式以常规方式匹配,但它不会导致当前匹配位置发生更改。

尝试:

var rgx=/(?=.*\d)(?=.*[a-zA-Z])(?=.*[^0-9a-zA-Z])/ 

//my test 
var theTest=['[email protected]','uiou5','4761238|z','jhkj','8989go','[email protected]']; 
for (i=0;i<theTest.length;i++) alert(theTest[i]+' '+rgx.test(theTest[i])); 

所以最初我们测试1个位数(?=.*\d)。它可以在某些事物之前或之前。
接下来是字母字符和非字母字符。使用\w(“单词”字符是任何字母或数字)重复数字是错误的(只有数字和特殊字符的测试是真实的)。
\是一个字符串中的特殊含义,所以测试是错误的。

希望帮助

+0

非常感谢mucho :) – 2013-03-13 16:57:50

+0

[为什么你从同一个论坛复制其他人对这个问题的回答,这个问题是从哪个版本复制的?](http://www.webdeveloper.com/forum/showthread.php?273367-Need-to-匹配-AT-至少一字母-AT-至少酮数和-AT-至少邻ne-non-alphanum)很奇怪! – DMK 2013-03-22 15:17:18

1

此外,而不是使得if陈述这些嵌套楼梯,打破了早。这是更清洁:

function passwordValidate(password, password_c, msg) { 
    if (!notEmpty(password, "Enter a password")) { 
     return false; 
    } 

    if (password.value !== password_c.value) { 
     alert("Passwords don't match"); 
     return false; 
    } 

    if(!/(?=.*\d)(?=.*[a-zA-Z])(?=.*[^\da-zA-Z])/.test(password.value)) { 
     alert("Must have a special character in your password"); 
     return false; 
    } 

    alert(msg); 
    return true; 
} 
+0

它可能并不是缺乏导致失败的特殊字符。 – MikeM 2013-03-13 17:06:30

+0

,看起来更干净整洁,谢谢 – 2013-03-13 17:06:44

0

//这可能是更容易做独立的测试 -

function testPassword(pw){ 
    pw= pw.replace(/\s+/, ''); //remove spaces 
    var msg= [' non-alphanumerical', ' alphabetical', ' digit'], 
    rx= [/\W/,/[a-zA-Z]/,/\d/]; 
    for(var i= 0;i<3;i++){ 
     if(!rx[i].test(pw)) throw Error('At least one'+ 
     msg[i]+' character is required'); 
    } 
    return pw; 
} 
相关问题