2010-11-09 5 views
1

Sur le système, je travaille avec, nous avons une classe de mot de passe qui valide en lançant des exceptions dans les conditions suivantes:Validation du mot de passe en JavaScript; RegEx

public Password(string password) 
    : base(password) 
{ 
    // Must contain digit, special character, or uppercase character 

    var charArray = password.ToCharArray(); 

    var hasDigit = charArray.Select(c => char.IsDigit(c)).Any(); 
    var hasSpecialCharacter = charArray.Select(c => char.IsSymbol(c)).Any(); 
    var hasUpperCase = charArray.Select(c => char.IsUpper(c)).Any(); 

    if (!hasDigit && !hasSpecialCharacter && !hasUpperCase) 
    { 
     throw new ArgumentOutOfRangeException 
      ("Must contain at least one digit, symbol, or upper-case letter."); 
    } 
} 

Si je devais écrire ce même chèque hasDigit, hasSpecialCharater et hasUpperCase en JavaScript, à quoi cela ressemblerait-il?

JavaScript n'a pas ces mêmes prototypes de caractères, donc je dois utiliser des expressions régulières, non?

+0

Le Char.IsSymbol() n'est pas n-trivial à implémenter. (J'ai juste jeté un coup d'oeil dans le mscorlib.dll utilisant le réflecteur de RedGate.) Si vous voulez que vos implémentations de javascript et de C# correspondent exactement, vous feriez mieux d'employer la même expression régulière sur le client et le serveur. – dana

Répondre

1

Les trois conditions peuvent être combinées avec:

if (/\d|\W|[A-Z]/.test(theString)) { 
... 

  • \d → 1 chiffre (0-9),
  • \W → 1 caractère non-mot (tout sauf 0 -9, az, AZ et _) Ceci correspond plus au caractère que le IsSymbol de C#, dans le cas où le mot de passe prend en charge les caractères en dehors de ASCII,
  • [A-Z] → 1 caractère majuscule

mais les seuls personnages qui ne correspond pas à \d|\W|[A-Z] sont a à z, que l'on peut ainsi simplement écrire

if (/[^a-z]/.test(theString)) { 
+0

C'est différent de ce que l'OP a demandé. Vous vérifiez si le mot de passe a un chiffre ET une majuscule ET un specialchar. Il veut vérifier s'il a au moins un des trois. – MartinodF

+0

@MartinodF: fixe. – kennytm

1

hasDigit:

/\d/.test(password); 

hasUpperCase:

/[A-Z]/.test(password); 

hasSpecialCharacter:

/[^a-zA-Z0-9]/.test(password); 

modifier.test est beaucoup mieux que .match

0

Vous devriez être en mesure de combiner tous des tests dans une regex JS:

if (!passwordString.match(/[^a-z ]/)) { 
    alert('Invalid password.'); 
    return false; 
} 
Questions connexes