パスワードチェッカーに少し問題があります。
いくつかのフィールドを持つ登録フォームがあります。 jQuery Validateプラグインを使用して、ユーザー入力を検証します。
パスワード検証以外はすべて機能します。
パスワードはいくつかの最小要件を満たす必要があります。
現時点では、このコードを使用してパスワードを検証します。
$.validator.addMethod("pwcheck",
function(value, element) {
return /^[A-Za-z0-9\d=!\-@._*]+$/.test(value);
});
このコードは許可された文字に対して機能しますが、最小要件には機能しません。たとえば、小文字の要件に(?=.*[a-z])
を使用できることを知っています。しかし、私はそれを機能させません。
(?=.*[a-z])
を追加すると、コード全体が機能しなくなります。既存のコードに適切にコードを追加する方法を知る必要があります。
ご回答ありがとうございます!
これは完全なコードです
<script>
$(function() {
$("#regform").validate({
rules: {
forename: {
required: true
},
surname: {
required: true
},
username: {
required: true
},
password: {
required: true,
pwcheck: true,
minlength: 8
},
password2: {
required: true,
equalTo: "#password"
},
mail1: {
required: true,
email: true
},
mail2: {
required: true,
equalTo: "#mail1"
}
},
messages: {
forename: {
required: "Vornamen angeben"
},
surname: {
required: "Nachnamen angeben"
},
username: {
required: "Usernamen angeben"
},
password: {
required: "Passwort angeben",
pwcheck: "Das Passwort entspricht nicht den Kriterien!",
minlength: "Das Passwort entspricht nicht den Kriterien!"
},
password2: {
required: "Passwort wiederholen",
equalTo: "Die Passwörter stimmen nicht überein"
},
mail1: {
required: "Mail-Adresse angeben",
email: "ungültiges Mail-Format"
},
mail2: {
required: "Mail-Adresse wiederholen",
equalTo: "Die Mail-Adressen stimmen nicht überein"
}
}
});
$.validator.addMethod("pwcheck",
function(value, element) {
return /^[A-Za-z0-9\d=!\-@._*]+$/.test(value);
});
});
</script>
(?=.*[a-z])
を追加すると、コード全体が機能しなくなります。
ここに追加します:
/^(?=.*[a-z])[A-Za-z0-9\d=!\-@._*]+$/
ただし、先読みなしでこれを行う方がはるかに簡単です。
$.validator.addMethod("pwcheck", function(value) {
return /^[A-Za-z0-9\d=!\-@._*]*$/.test(value) // consists of only these
&& /[a-z]/.test(value) // has a lowercase letter
&& /\d/.test(value) // has a digit
});
最小8文字で「+」の代わりに{8、}を使用できますが、最大8文字以上ではなく{8、20}を使用できます。
本当に、すべての検証を単一の正規表現に絞り込もうとする価値はありません。分割すると、メンテナンスがはるかに簡単になり、バグが発生しにくくなります。また、要件全体ではなく、パスワードが失敗した特定の理由をユーザーに報告できます。
いくつかのチェックに分割できます
//proper length
value.length >= 8
//only allowed characters
/^[A-Za-z0-9\d=!\-@._*]+$/.test(value)
//has a digit
/\d/.test(value)
//has a lowercase letter
/[a-z]/.test(value)
私はjQuery Validationプラグインに精通していませんが、失敗した各テストに役立つメッセージを返してくれると思います。
パスワード検証では、次のようないくつかのルールを使用できます。
var _validatePassword = function (validateUserNameRules, inputModel)
{
//bolean parameter validateUserNameRules -> true/false
//this method recive a model like this:
//inputModel.userName -> string
//inputModel.password -> string
//inputModel.password2 -> String
var ResultModel = {
ResultId: 1, //1 success
Message: "Password is correct."
};
if (validateUserNameRules && inputModel.userName == "") {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: User name cannot be blank.";
return (ResultModel);
}
var re = /^\w+$/;
if (validateUserNameRules && !re.test(inputModel.userName)) {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Username must contain only letters, numbers and underscores.";
return (ResultModel);
}
if (inputModel.password != "" && inputModel.password == inputModel.password2) {
if (inputModel.password.length < 6) {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Password must contain at least six characters.";
return (ResultModel);
}
if (validateUserNameRules && inputModel.password == inputModel.userName) {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Password must be different from the Account Name.";
return (ResultModel);
}
re = /[0-9]/;
if (!re.test(inputModel.password)) {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Password must contain at least one number (0-9).";
return (ResultModel);
}
re = /[a-z]/;
if (!re.test(inputModel.password)) {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Password must contain at least one lowercase letter (a-z).";
return (ResultModel);
}
re = /[A-Z]/;
if (!re.test(inputModel.password)) {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Password must contain at least one uppercase letter (A-Z).";
return (ResultModel);
}
} else {
ResultModel.ResultId = 2;
ResultModel.Message = "Error: Please check that you've entered and confirmed your password.";
return (ResultModel);
}
return (ResultModel); //success password validation!!
};
パスワードの確認および最小文字の検証を確認する場合は、次を使用できます。
<input type="password" id="password" name="password" class="validate[required,minSize[8]]"/>
<input type="password" id="confirm_password" name="confirm_password" class="validate[required,equals[password]]"/>