-1

私はパスワードバリデーターを作ろうとしています。少なくとも1つの文字、少なくとも1つの数字、および少なくとも1つの英数字以外の文字を含むパスワードのみを許可します。

私は以下が機能します:

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)」に変更しました。これを1つの正規表現に組み合わせる方法を知っている人はいますか?

4

3 に答える 3

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;
}
于 2013-03-13T16:58:48.110 に答える
1

アサーションを使用できます。
アサーション サブパターンは、現在の一致位置が変更されないことを除いて、通常の方法で一致します。

試す:

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

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

したがって、最初は 1 桁 ( ?=.*\d) をテストします。前に何かを付けても付けなくてもかまいません。
次は英字と非英字です。\w("word" character is any letter or digit) which duplicate digitsの使用は間違っています (テストは数字と特殊文字のみで真です)。
\文字列内の特別な意味であるため、テストは間違っています。

それが役立つことを願っています

于 2013-03-13T16:55:10.723 に答える
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;
}
于 2013-03-13T17:32:59.040 に答える