Güçlü parola doğrulama için PHP düzenli ifade

3 Cevap php

Ben web etrafında şu normal ifadeyi gördüm.

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$

Sadece dize eğer doğrular:

   * contain at least (1) upper case letter
   * contain at least (1) lower case letter
   * contain at least (1) number or special character
   * contain at least (8) characters in length

Ben o kadar dize denetler, böylece bu düzenli ifade dönüştürmek için nasıl bilmek istiyorum

* contain at least (2) upper case letter
* contain at least (2) lower case letter
* contain at least (2) digits
* contain at least (2) special character
* contain at least (8) characters in length

Well, if it contains at least 2 upper,lower,digits and special characters then I wouldn't need the 8 characters length.

Özel karakterler şunlardır:

! `~ @ # $% ^ & * () _-+ = [] \ | {};:. '" / <>?

3 Cevap

Bu regex adapte iyi yolu onu kovmak ve yerine bazı kod yazmak için. Gerekli regex çok uzun ve karmaşık olurdu, bunu yazdım iki saat sonra okumak mümkün olmaz. Eşdeğer PHP kodu sıkıcı olacak, ama en azından ne yazdı anlamak mümkün olacak.

Bu arada size bir slam olarak verilmemiştir. Regexes çoğu parola gücü doğrulama için sadece zar zor uygundur, ancak gereksinimleri normalden daha karmaşıktır, ve sadece buna değer değil. Ayrıca, yayınlanmıştır regex bok. Eğer web etrafında yüzen bulmak Regexes güvenme. Ya da bu konuda herhangi bir kod. Ya da, halt, anything. :-/

Ben Alan ile anlaşmak zorunda. Varolan regex çok karmaşık ise, neden sadece tek bir regex denemek ve bunu?

Sadece cana basit adımda içine yıkmak. Bunu zaten yaptık.

Şimdi, parçaları doğrulamak 4 regex temel mantığı ekleyebilir ve dize uzunluğunu ölçmek için 4. regex yazıyorum. Bitti.

Bunun yerine ayıklamak hangi, bu:

(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$ (btw çalışmıyor ki ...)

ya da bu:

function valid_pass($candidate) {
   $r1='/[A-Z]/';  //Uppercase
   $r2='/[a-z]/';  //lowercase
   $r3='/[!@#$%^&*()\-_=+{};:,<.>]/';  // whatever you mean by 'special char'
   $r4='/[0-9]/';  //numbers

   if(preg_match_all($r1,$candidate, $o)<2) return FALSE;

   if(preg_match_all($r2,$candidate, $o)<2) return FALSE;

   if(preg_match_all($r3,$candidate, $o)<2) return FALSE;

   if(preg_match_all($r4,$candidate, $o)<2) return FALSE;

   if(strlen($candidate)<8) return FALSE;

   return TRUE;
}

Millet onlar bir seferde bunu böylece hiç kimse sadece anlayabileceği bir regex yazmak zorunda hissediyorum neden bana ötesinde ...

Eğer gerçekten normal bir ifade kullanmak istiyorsanız, bu deneyin:

(?=^(?:[^A-Z]*[A-Z]){2})(?=^(?:[^a-z]*[a-z]){2})(?=^(?:\D*\d){2})(?=^(?:\w*\W){2})^[A-Za-z\d\W]{8,}$

Bazı açıklama:

  • [^A-Z]*[A-Z] iki tekrarları için (?=^(?:[^A-Z]*[A-Z]){2}) testleri, bir büyük harflerden oluşan büyük harflerle dışında sıfır veya daha fazla karakter dizisidir
  • (?=^(?:[^a-z]*[a-z]){2}) (küçük harfler ile yukarıdaki ile aynı)
  • (?=^(?:\D*\d){2}) (basamak ile yukarıdaki gibi aynı)
  • (?=^(?:\w*\W){2}) (sözcük olmayan karakterler ile yukarıdaki gibi, ama istediğiniz özel karakterler ne olursa olsun bir karakter sınıfı ile \W değişebilir)
  • ^[A-Za-z\d\W]{8,}$, sadece diğer tüm karakter sınıflarının birliği karakterden oluşan bütün dizenin uzunluğunu sınar.