Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sprawdzanie hasła pod względem wpisanych znaków
Forum PHP.pl > Forum > Przedszkole
JamalBIG
Witam

W jaki sposób mogę sprawdzić czy podane hasło w polu tekstowym zawiera duże i małe litery, cyfry i znaki specjalne? (znalazłem wiele podpowiedzi ale z użytą funkcją 'ereg' a nie potrafię przekształcić jej na preg_match)

  1. if (ereg('[0-9]', 'tu jest liczba 5')) {
  2. echo "tak";
  3. }


  1. if (ereg('[A-Z]', 'tu jest duza litera D')) {
  2. echo "tak";
  3. }
_Borys_
Prosty przykład na sprawdzenie czy duże i małe litery oraz cyfry i _ oraz -
ilość znaków w haśle min 6, max 40, niektóre znaki specjalne wymagają backslash-a przed sobą

  1. $haslo = 'acbABc23_-';
  2. if (preg_match('/^([a-zA-Z0-9_-]{6,40})$/D',$haslo)){
  3. echo 'OK';
  4. }
  5. else {
  6. echo 'NOT OK';
  7. }


Tu fajnie wytłumaczone wyrażenia regularne:

Wyrażenia regularne PCRE w PHP Tutorial
JamalBIG
Dzięki wielkie za odpowiedź ale nie do końca funkcjonuje ten kod, kiedy podaje
  1. $haslo = '1234_-';

pokazuje również ok a chodzi o to aby były spełnione wszystkie kryteria czyli: duże litery, małe litery, cyfry i znaki specjalne;
_Borys_
do tego służą kwantyfikatory

+ - conajmniej raz
* - zero lub dowolną ilość razy
? - zero lub jeden raz

Przykład, conajmniej jedna mała litera, conajmniej jedna duża litera, conajmniej jedna cyfra i conajmniej jeden z tych dwóch znaków specjalnych

Kod
'/^([a-z]+[A-Z]+[0-9]+[_-]+)$/D'
b4rt3kk
Cytat(_Borys_ @ 8.01.2013, 16:46:53 ) *
Prosty przykład na sprawdzenie czy duże i małe litery oraz cyfry i _ oraz -
ilość znaków w haśle min 6, max 40, niektóre znaki specjalne wymagają backslash-a przed sobą

  1. $haslo = 'acbABc23_-';
  2. if (preg_match('/^([a-zA-Z0-9_-]{6,40})$/D',$haslo)){
  3. echo 'OK';
  4. }
  5. else {
  6. echo 'NOT OK';
  7. }


Tu fajnie wytłumaczone wyrażenia regularne:

Wyrażenia regularne PCRE w PHP Tutorial


To co napisałeś nie spowoduje, że przejdzie jedynie ciąg znaków zawierający małe, duże litery, liczby i parę znaków, ale wszystkie ciągi zawierające się w tym przedziale. Równie dobrze mogę wpisać hasło 'aaaaaaa' lub '-------', a chyba nie o to koledze chodziło?
Gość
Cytat(_Borys_ @ 8.01.2013, 23:16:18 ) *
do tego służą kwantyfikatory

+ - conajmniej raz
* - zero lub dowolną ilość razy
? - zero lub jeden raz

Przykład, conajmniej jedna mała litera, conajmniej jedna duża litera, conajmniej jedna cyfra i conajmniej jeden z tych dwóch znaków specjalnych

Kod
'/^([a-z]+[A-Z]+[0-9]+[_-]+)$/D'


Też źle, przy takim wyrażeniu zakładasz konkretną kolejność znaków, nie pasuje do wzorca np. Az-1. A tak przy okazji pisze się: co najmniej (osobno)

Propozycja: zamienić dozwolone znaki na wartości puste, jeśli coś zostanie, to znaczy, że napis jest nieprawidłowy
Gość
Nie mogę edytować, a konta nie chce mi się zakładać. Jednak propozycja jest zła, bo nie uwzględni, że znaki muszą wystąpić. Chyba nie obejdzie się bez sprawdzania kilku warunków
mokry
tu masz regexpa, który być może Cię zadowoli:
Kod
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$


Warunki:
- przynajmniej jedna wielka litera
- przynajmniej jedna mała litera
- przynajmniej jedna cyfra lub inny znak specjalny
- długość minimum 8 znaków
JamalBIG
Dzięki za odpowiedzi ale poniższy skrypt nie chce zadziałać:
  1. if (preg_match("(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$", '123abcABC')) echo "OK"; else echo "NIE";
mokry
  1. $haslo = '12cABC';
  2.  
  3. if (preg_match('/(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/', $haslo))
  4. {
  5. echo "OK";
  6. }
  7. else
  8. {
  9. echo "NIE";
  10. }
b4rt3kk
Cytat(JamalBIG @ 9.01.2013, 10:54:50 ) *
Dzięki za odpowiedzi ale poniższy skrypt nie chce zadziałać:
  1. if (preg_match("(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$", '123abcABC')) echo "OK"; else echo "NIE";


Obawiam się, że jednym wyrażeniem regularnym nie załatwisz całości, nie po to one są. Nie ma nawet takiego operatora jak AND, który byłby tu pomocny.

  1. $password = "sdaSD!s";
  2.  
  3. if (preg_match('/[A-Z]/', $password)) echo 'zawiera duże litery<br/>'; else echo 'nie zawiera dużych liter<br/>';
  4. if (preg_match('/[0-9]/', $password)) echo 'zawiera cyfry<br/>'; else echo 'nie zawiera cyfr<br/>';
  5. if (preg_match('/[\!\@\#\$\%\^\&\*]/', $password)) echo 'zawiera znaki specjalne<br/>'; else echo 'nie zawiera znaków specjalnych<br/>';
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.