Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]preg_match
Forum PHP.pl > Forum > Przedszkole
nait
Witam, mam mały problem z preg_match, otóż nie mogę uzyskać pożądanego efektu. Mam taki kod:
  1. if (preg_match('/^([!@#$%^&*()a-zA-Z0-9]{8,18})$/', $password)) {
  2. echo "<br />OK<br />";
  3. }


Ale wymyśliłem sobie jeszcze, żeby sprawdzać czy występuje co najmniej jedno powtórzenie:
- A-Z,
- a-z,
- 0-9,
- jeden ze znakow: !@#$%^&*()
i żeby łącznie łańcuch miał {8,18} znaków.

Kombinuje od kilku godzin, szukam na necie ale za Boga nie wiem jak to poskładać w całość. thumbsdownsmileyanim.gif
lukasamd
Głowy nie dam, ale w jednym pregu chyba tego nie zrobisz.

  1. if (isset($password[7]) &&
  2. !isset($password[18]) &&
  3. preg_match('/[a-z]+/', $password) &&
  4. preg_match('/[A-Z]+/', $password) &&
  5. preg_match('/[0-9]+/', $password) &&
  6. preg_match('/[!@#$%^&*()]+/', $password) &&
  7. !preg_match('/[^a-zA-Z0-9!@#$%^&*()]+/', $password))
  8. {
  9. echo "<br />OK2<br />";
  10. }
nait
  1. if (isset($password[7]) &&
  2. !isset($password[18]) &&
  3. preg_match('/[a-z]+/', $password) &&
  4. preg_match('/[A-Z]+/', $password) &&
  5. preg_match('/[0-9]+/', $password) &&
  6. preg_match('/[!@#$%^&*()]+/', $password)){
  7. echo "<br /><br />PASUJE<br /><br />";
  8. }


Czy ta ostatnia negacja prega jest potrzebna?tongue.gif Testowałem i nie zauważyłem różnicy.

Ma ktoś pomysł jak to złożyć w jedno wyrażenie? zakochany.gif

P.S. pierwszy raz się spotykam z takim zapisem isset, mógłbyś mi go wyjaśnić bo trochę nie kumam tego smile.gif
lukasamd
Ostatni preg jest po to, aby w haśle nie było żadnych innych znaków, np. |, =, } (gdy go usuniesz, znaki te zostaną również zaakceptowane).
Różnica między isset a strlen w tym wypadku jest taka, że isset to konstrukcja a nie funkcja, przez co jest nieco szybsza.

Być może da się to wszystko wpakować w jedno wyrażenie, ja nie wiem jak, bo pojawia się problem kolejności przy podawaniu kolejnych grup.
nait
Ok ale isset($x[7]) musi składać się z co najmniej 8 znaków tak? A co by było gdyby $x było tablicą?
Posio
Myślę, że da się to posklejać w jedną całość manipulując sobie lekko zmiennymi. Przykładowo mam zrobione tak dla e-maila:

  1. $check_email = '/^[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/';


A używam tego tak:
  1. if(!preg_match($check_email, $email))


Czyli można zrobić coś w zasadzie:

  1. $przyklad = $check_email + $check_password;
  2.  
  3. if(!preg_match($przyklad, $email))


Jak już pisałem dałem tylko przykład. Dostosuj sobie do swoich wymagań.
-ines-
Podepnę się pod temat ze swoim problemem:)


Mianowicie chce uzyskać efekt by podawana cyfra była od 0.00 do 99999.99
Stworzyłam taki kod:

if(preg_match('/[0-9]{1,5}\.[0-9]{2}/', $_POST['price']))
{
//prawidłowa
….
}
Problem polega na tym, że jeśli wpisze 123456.01 czy 12345.12568 to program mi to przepuszcza jako prawidłowe
abort
ines, sprawdź te dwa:

Kod
if(preg_match('/^[0-9]{1,5}\.[0-9]{2}$/', $_POST['price']))
if(preg_match('/^[0-9]{1,5}\.[0-9]{2}\s*$/', $_POST['price']))


nait, napisałeś "czy występuje co najmniej jedno powtórzenie" - i podałeś zakresy a-z, A-Z, 0-9 (i znaki specjalne). Czy to, co rozumiesz przez "powtórzenie", to jest
1. wystąpienie dwóch DOWOLNYCH znaków z jednej grupy koło siebie
2. wystąpienie dwóch TAKICH SAMYCH znaków z jednej grupy obok siebie

Pytam, bo to nie jest to samo (ciąg znaków "aa" w haśle pasuje do obu rzeczy, ale "qw" przypasuje tylko do pierwszego warunku...

Co do samego pytania "czy da się jednym regexpem" - jakiś cień szansy (bardzo rozmazany) widzę, ale nawet jeśli by się dało, to samo wyrażenie będzie mega zagmatwane - imho lepiej wrzuć to w kilka wyrażeń, na pewno będzie czytelniejsze i łatwiejsze przy ewentualnych modyfikacjach.
-ines-
dziękuje za pomoc:)
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.