2013-03-13 51 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; 
} 
相關問題