2010-09-09 14 views
3

Quelqu'un peut-il m'aider à écrire une expression régulière dans la description suivante?JavaScript pour valider le mot de passe

Le mot de passe contient des caractères à partir d'au moins trois des cinq catégories suivantes:

  • caractères majuscules anglais (A - Z)
  • caractères minuscules anglais (A - Z)
  • base 10 chiffres (! 0 - 9)
  • non alphanumériques (Par exemple:, $, # ou%)
  • caractères Unicode

La longueur minimale du mot de passe est 6.

+5

Pourquoi le downvote? L'OP ne cherche pas à créer un login Javascript, mais une simple validation lorsque l'utilisateur spécifie le mot de passe. –

+1

Quelques anciens commentaires sur les mots de passe de pseudo-forte: http://www.codinghorror.com/blog/2005/07/passwords-vs-pass-phrases.html – Douglas

+0

Ce n'est pas une tâche simple pour une expression régulière. Comme Sachin le propose dans son anser, il serait plus facile d'écrire votre propre routine d'analyse de chaînes et de compter si vos critères correspondent. – splash

Répondre

3

Une meilleure façon de traiter cela est de diviser chacune des conditions et d'avoir une regex pour chacune des conditions. Puis comptez combien ont été satisfaits pour le mot de passe entré. De cette façon, vous pouvez même dire à l'utilisateur si le mot de passe est moyen, répond aux critères ou un mot de passe très fort.

if (password.length < 6) { 
    alert("password needs to be atleast 6 characters long"); 
} 

var count = 0; 
//UpperCase 
if(/[A-Z]/.test(password)) { 
    count += 1; 
} 
//Lowercase 
if(/[a-z]/.test(password)) { 
    count += 1; 
} 
//Numbers 
if(/\d/.test(password)) { 
    count += 1; 
} 
//Non alphas(special chars) 
if(/\W/.test(password)) { 
    count += 1; 
} 
if (count < 3) { 
    alert("password does not match atleast 3 criterias"); 
} 

Vous ne savez pas comment faire correspondre les caractères Unicode à l'aide de regex. Reste toutes les conditions sont disponibles ci-dessus.

+1

Ceci est un commentaire, pas une réponse. (Entièrement d'accord, d'ailleurs.) –

+0

Mise à jour la réponse trop –

+0

Merci Sachin, il fonctionne très bien – Abhimanyu

1

[A-Za-z!$#%\d\u0100]{6} correspond aS1%eĀ.

\u0100 est pour un. Vous pouvez insérer d'autres codes Unicode dont vous avez besoin. Vous pouvez les trouver here.

EDIT: Pour un minimum de 6 caractères est la regex correcte [A-Za-z!$#%\d\u0100]{6,}.

EDIT 2: Pour inclure une plage de caractères Unicode (que ce soit Latin Extended-B), l'expression regex doit ressembler à ^[A-Za-z!$#%\d\u0100-\u017f]{6,}$. Vous pouvez trouver les plages de codes Unicode here.

EDIT 3: J'ai développé une petite fonction qui vérifie si le mot de passe donné est conforme aux critères. Vous devez définir la plage Unicode dans la fonction.

function isValidPassword(password) {  
    var unicodeRange = "\\u0100-\\u0105"; 
    var criteria = ["A-Z","a-z","\\d","!$#%",unicodeRange]; 

    // check whether it doesn't include other characters 
    var re = new RegExp("^[" + criteria.join("") +"]{6,}$"); 
    if(!re.test(password)) return false; 

    var minSatisfiedCondition = 3; 
    var satisfiedCount = 0; 
    for(var i=0; i < criteria.length; i++) { 
     re = new RegExp("[" + criteria[i] + "]"); 
     if(re.test(password)) ++satisfiedCount; 

    } 
    return (satisfiedCount >= minSatisfiedCondition); 
}​ 

Il existe un échantillon de travail here.

+0

Avec cette expressions régulières que vous ne savez pas si au moins 3 critères du PO sont correspondent. – splash

+0

@splash: Oui, vous avez raison. J'ai édité ma réponse et mis une fonction de validation. – Zafer