Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]wyrażenie regularne
Forum PHP.pl > Forum > Przedszkole
john_doe
Witam,

stworzyłem takie wyrażenie

  1. $passPattern = '/[a-zA-Z0-9]{8,}$/';


i działa ok jednak z dużym ale...
hasło ma mieć min 8 znaków i być kombinacją liter małych, dużych i cyfr. To wyrażenie pozwala na min 8 znaków ale mogą to być np. same liczby. Jak zrobić by wymusić żeby z każdej grupy znaków pojawił się co najmniej jeden?
MateuszS
  1. <?
  2. $string=array('a','b','c'); //itd
  3. $liczby=array(1,2,3,4,5); //itd
  4.  
  5. $login=$_POST['login'];
  6. if(in_array($string, $login) and in_array($liczby, $login)) {
  7. //ok
  8. } else {
  9. echo 'o czyms zapomniales';
  10. }
  11.  
  12. ?>
john_doe
dzięki za chęci jednak to nie o to chodzi. Moim zdaniem musi to pójść wyrażeniami.
Twój kod hmmmmmmmm.... w tablicach musiałbym mieć encyklopedie smile.gif
zegarek84
nie mam czasu na testy ale Twoje wyrażenie przyjmie też niedozwolone znaki na początku jeśli na końcu będzie 8 lub więcej dozwolonych znaków winksmiley.jpg - nie dałeś początku wyrażenia

tak na szybko to proponuję 4 wyrażenia regularne:
'/^[a-zA-Z0-9]{8,}$/' - po sprawdzeniu tego dopiero sprawdzić czy występują pozostałe 3 - niewielka różnica od Twojego wyrażenia winksmiley.jpg
'/[a-z]/'
'/[A-Z]/'
'/[0-9]/'
Zyx
Wyrażenie regularne da się ułożyć do takiego problemu, ale będzie ono tak rozbudowane, że praktycznie szkoda zachodu się w to bawić. Ogólnie musiałbyś do wyrażenia wklepać wszystkie możliwe przypadki: (L - litera, C - cyfra; X - dowolny dozwolony znak):

LCXXXXXX...
LLCXXXXX...
LLLCXXXX...
LLLLCXXX...
LLLLLCXX...
LLLLLLCX...
LLLLLLLC...
LLLLLLLL... (i tam gdzieś C)

i w drugą stronę z zamienionymi "C" i "L". Dzieje się tak dlatego, że w wyrażeniach regularnych nie występuje pojęcie pamięci - nie jesteś w stanie ułożyć wyrażenia, które np. sprawdzi, czy ilość liter "a" równa jest ilości liter "b", natomiast w takich przypadkach jak ten, masz utrudnioną robotę, bo musisz rozpatrywać wszystkie możliwe przypadki osobno. Napisz sobie zwykły kod, który to sprawdzi i po problemie:

  1. if(($length = strlen($pass)) >= 8)
  2. {
  3. $isDigit = false;
  4. $isLetter = false;
  5. for($i = 0; $i < $length; $i++)
  6. {
  7. if(ctype_digit($pass[$i]))
  8. {
  9. $isDigit = true;
  10. }
  11. elseif(ctype_alpha($pass[$i]))
  12. {
  13. $isLetter = true;
  14. }
  15. else
  16. {
  17. die('Błędne hasło');
  18. }
  19. }
  20. if(!$isDigit || !$isLetter)
  21. {
  22. die('Błędne hasło');
  23. }
  24. }
athei
  1. /^(?=[a-zA-Z]*\d)(?=[A-Z0-9]*[a-z])(?=[a-z0-9]*[A-Z])[a-zA-Z0-9]{8,20}$/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.