次の条件を満たす必要があるパスワードを検証するための正規表現を作成しようとしています。
以下を試してみましたが、うまくいかないようです。
http://jsfiddle.net/many_tentacles/Hzuc9/
<input type='button' value='click' class='buttonClick' />
<input type='text' />
<div></div>
そして...
$(".buttonClick").click(function () {
if ($("input[type=text]").filter(function () {
return this.value.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8})$/);
})) {
$("div").text("pass");
} else {
$("div").text("fail");
}
});
何か案は?
正規表現は次のようになります。
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/
説明は次のとおりです。
/^
(?=.*\d) // should contain at least one digit
(?=.*[a-z]) // should contain at least one lower case
(?=.*[A-Z]) // should contain at least one upper case
[a-zA-Z0-9]{8,} // should contain at least 8 from the mentioned characters
$/
個々の正規表現を使用してさまざまな部分をテストする方が、すべての部分をカバーする単一の正規表現を取得するよりもかなり簡単です。また、検証基準を簡単に追加または削除できます。
また、.filter()
の使用が間違っていたことにも注意してください。常にjQueryオブジェクトを返します(JavaScriptで真実と見なされます)。個人的には、.each()
ループを使用してすべての入力を反復処理し、個々の合格/不合格ステータスを報告します。以下のようなもの:
$(".buttonClick").click(function () {
$("input[type=text]").each(function () {
var validated = true;
if(this.value.length < 8)
validated = false;
if(!/\d/.test(this.value))
validated = false;
if(!/[a-z]/.test(this.value))
validated = false;
if(!/[A-Z]/.test(this.value))
validated = false;
if(/[^0-9a-zA-Z]/.test(this.value))
validated = false;
$('div').text(validated ? "pass" : "fail");
// use DOM traversal to select the correct div for this input above
});
});
少なくとも8 = {8,}
:
str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/)
正規表現では、正確に8文字しか使用できません。 {8,}
の代わりに{8}
を使用して8個以上を指定します。
しかし、パスワードに許可される文字範囲を制限するのはなぜですか? 8文字の英数字パスワードは、数分以内にmy phoneによってブルートフォースできます。