J'essaie d'écrire une expression régulière pour valider un mot de passe qui doit répondre aux critères suivants:
J'ai essayé ce qui suit mais cela ne semble pas fonctionner.
http://jsfiddle.net/many_tentacles/Hzuc9/
<input type='button' value='click' class='buttonClick' />
<input type='text' />
<div></div>
et...
$(".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");
}
});
Des idées?
Votre expression régulière devrait ressembler à:
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/
Voici une explication:
/^
(?=.*\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
$/
L'utilisation d'expressions régulières individuelles pour tester les différentes parties serait considérablement plus facile que d'essayer d'obtenir une seule expression régulière pour toutes les couvrir. Cela facilite également l'ajout ou la suppression de critères de validation.
Notez également que votre utilisation de .filter()
était incorrecte; il retournera toujours un objet jQuery (ce qui est considéré comme une vérité en JavaScript). Personnellement, j'utiliserais une boucle .each()
pour parcourir toutes les entrées et signaler les états de réussite/échec individuels. Quelque chose comme le ci-dessous:
$(".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
});
});
Au moins 8 = {8,}
:
str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/)
Votre regex n'autorise que 8 caractères. Utilisation {8,}
pour spécifier huit ou plus au lieu de {8}
.
Mais pourquoi voudriez-vous limiter la plage de caractères autorisée pour vos mots de passe? Les mots de passe alphanumériques à 8 caractères peuvent être renforcés par mon téléphone en quelques minutes.