Bu düzenli ifade çalışmak istiyorsunuz?

6 Cevap php
^([a-zA-Z0-9!@#$%^&*|()_\-+=\[\]{}:;\"',<.>?\/~`]{4,})$

Bu düzenli ifade bu kurallara için çalışmak istiyorsunuz?

  • En az 4 karakter olmalıdır
  • Karakterler (/ non-harfle harfle) harflerinin karışımı, sayısal ve aşağıdaki karakterler olabilir:! @ # $% ^ & (*) _ - + = | [{}]; : <.>? ", /

Bu bir şifre validator olmak niyetiyle. Dili PHP.

6 Cevap

Evet?

Dürüst olmak gerekirse, ne soruyorsun? Neden bunu test değil mi?

Ancak, bazı sorular, onu geliştirmek önerileri isterseniz:

  1. Ne bu regex kontrol ediyor?
  2. Neden izin verilen karakter gibi büyük bir dizi var mı?
  3. Neden /\w/ yerine /0-9a-zA-Z_/ kullanımı değil mi?
  4. Neden () s şeyi var mı? Sen zaten her şey var, çünkü her şeyi yakalamak gerekmez, onlar grup şey için gerekli değildir.

Ne yapacağını ayrı uzunluğunu kontrol edin ve sonra herhangi bir bad karakter olup olmadığını görmek için bir regex karşı kontrol edilir. Iyi karakterler listeniz sadece bunu bu şekilde yapmak daha kolay olabilir ki yeterince büyük gibi görünüyor. Ama sizin için ne yaptığınızı bağlı olabilir.

DÜZENLEME: PHP tam Perl değildir PCRE kütüphanesini kullanır ve PCRE'nin yılında, \w çünkü Şimdi biliyorum ki bu PHP-merkezli, /\w/ güvenlidir olacak {[(2 )]} Unicode sözcük karakterlerini maç. Böylece, neden uzunluğu kontrol ve geçersiz karakterler vardır sağlamak değil:

if(strlen($string) >= 4 && preg_match('[\s~\\]', $string) == 0) {
  # valid password
}

Alternatif olarak, az kullanılan POSIX karakter sınıfı [[:graph:]] kullanın. Bu hemen hemen aynı PHP Perl yaptığı gibi çalışması gerekir. [[:graph:]] ne istediğiniz gibi geliyor alfanümerik veya noktalama karakteri, maçlar ve [[:^graph:]] tersini eşleşmesi gerekir. Tüm karakterler grafiği maç olmadığını test etmek için:

preg('^[[:graph:]]+$', $string) == 1

Herhangi bir karakter grafik eşleşmiyor test etmek için:

preg('[[:^graph:]]', $string) == 0

Regex buddy senin arkadaşın.

Sen (.) virgül (,) ve tam durdurmak unuttum ve (~) ve aksan (`) tilde ekledi parçası değildi senin belirtim. Ayrıca bir karakter kümesi bildiriminde sadece bir kaç karakter kaçtı gerekir:

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

Ve bunun için bir PHP string beyanı olarak preg_match:

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

Ben aslında ters eğik çizgi, alan ve başında kontrol karakterleri dışında, ASCII hepsi var, ne yani bu bir fark, bunun yerine?

^([!-\[\]-~]{4,})$

Fazladan öncelemeli ve bazı önceden tanımlanmış (örneğin, \ w gibi, ya da en azından \ d) karakter sınıflarını kullanarak değil.

Bunun yanında ve size dize başlar ve eşleştirme biter, doğru görünüyor eğer regex sadece maç olacak, yani başında ve sonunda demir vardır:

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

Eğer gerçekten bir parola onaylayıcısı olarak kullanmak demek, güvensizlik kokuyor:

  • Neden 4 karakter şifreleri izin vardır?
  • Neden bazı karakterler yasaklanmasıdır? PHP bazı idare edemiyorlar? Niye edeyim ki? Sonuçta sadece bunun bir karma + tuz depolama bitireceğiz, kullanıcı o mutlu karakterleri girelim.

No Bu düzenli ifade basit bir nedenle, size devlet kuralları için çalışmak olmaz $ varsayılan maçlarda bir satır ise before son karakteri. Siz "1234 \ n" gibi şifre dizeleri izin vardır.

Çözüm basit. \z yerine $ kullanımı, ya da regex için D değiştirici uygulanır ya.