web-dev-qa-db-fra.com

javascript regex pour mot de passe contenant au moins 8 caractères, 1 chiffre, 1 majuscule et 1 minuscule

J'essaie d'écrire une expression régulière pour valider un mot de passe qui doit répondre aux critères suivants:

  • Contenir au moins 8 caractères
  • contenir au moins 1 chiffre
  • contenir au moins 1 caractère minuscule (a-z)
  • contenir au moins 1 caractère majuscule (A-Z)
  • contient seulement 0-9a-zA-Z

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?

61
Tom

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
$/
167
Minko Gechev

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
    });
});

Démo de travail

16
Anthony Grist

Au moins 8 = {8,}:

str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/)
3
nbrooks

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.

2
Tim Pietzcker