Przewidywanie w regularnych |
Przewidywanie w regularnych |
15.08.2012, 12:34:21
Post
#1
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) |
Witam
przeszukałem trochę internet i nie mogę znaleźć konkretnego rozwiązania a jest ono za pewne bardzo proste i nie będzie stanowiło dla Was wyjadaczy starych PHP-owców żadnego problemu. (nie jest to moja funkcja) hasło od 8 - 80 znaków w tym przynajmniej jedna wielka litera i przynajmniej jedna cyfra ponieważ użyte tutaj zostało przewidywanie (którego do końca nie rozumiem) potrzebuję sprawdzać hasło w którym są przynajmniej 2 duże litery i dwie cyfry (znak specjalny może być ale nie musi) kombinowałem tak
tu wszystko działa pod warunkiem, że dopasowania są spełniane po kolei a ja chcę, żeby w haśle duże litery lub cyfry były w obojętnie którym miejscu a nie np na końcu. a więc próbowałem tak oczywiście ten ostatni przykład nie działa tak jak powinien jeżeli macie linka do szczegółowego opisu zagadnienia albo możecie mi to wytłumaczyć to z góry dziękuję pozdo p.s. -nie zależy mi na gotowcu raczej na wytłumaczeniu, żebym zrozumiał Ten post edytował adamantd 15.08.2012, 12:37:48 |
|
|
15.08.2012, 13:21:17
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
Próbowałeś na siłę użyć skomplikowanych wyrażeń regularnych i nagle z jednego problemu zrobiły się dwa.
1. strlen do sprawdzenia długości hasła. Swoją drogą ograniczanie do 20 znaków jest co najmniej dyskusyjne - dlaczego miałbym nie móc mieć dłuższego? 2. Dwa proste wyrażenia regularne sprawdzające kolejno wystąpienie przynajmniej jednej wielkiej litery (#\p{Lu}#U) oraz jednej cyfry (#\d#). 3. Całość połączona logicznymi AND-ami. |
|
|
15.08.2012, 13:34:26
Post
#3
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) |
Crozin dobrze gada. Dodatkowo przy jego wersji w bardzo prosty sposób (dodając jeden warunek AND) możesz rozszerzyć wymagania na hasło np. w ten sposób, że będzesz wymagał jakiejś litery lub lakiegoś znaku specjalnego.
Regexpy są fajne - ale w ten sposób to się zajedziesz. Poza tym, pamiętając, że preg_match zwraca liczbę dopasowanych elementów i używając zaproponowanego Ci sposobu, jesteś w stanie jeszcze bardziej skonkretyzować wymagania na hasło, np. conajmniej dwie duże litery, conajmniej dwie małe litery i conajmniej jedna cyfra, i hasło nie krótsze niż 8 znaków: Kod $upper = preg_match('/[A-Z]'/, $entered_pass); $lower = preg_match('/[a-z]'/, $entered_pass); $digits = preg_match('/[0-9]'/, $entered_pass); if ( (strlen ($entered_pass) >= 8) && ($upper >=2) && ($lower >=2) && (digits > 0) ) { // kod dla hasła poprawnego } else { // kod dla hasła niepoprawnego } Z regexpem tego nie zrobisz. Zresztą, może i zrobisz - ale co się napocisz, to Twoje. Wyrażenia regularne są fajne (i ja je bardzo lubię), ale nie używajmy ich na siłę tam, gdzie da się coś zrobić prościej i szybciej (w sensie pisania kodu na pewno szybciej, w sensie czasu wykonywania przypuszczam, że też) |
|
|
15.08.2012, 13:45:47
Post
#4
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) |
Dzięki -to mi wystarczy, myślałem, że samymi regularnymi będzie bardziej profesional ale chyba rzeczywiście nie ma co sobie utrudniać życie tym bardziej, że nie jestem mistrzem regularnych
a to rozbudowując o znaki specjalne -dużo mniej zastanawiania się i czasu na pisanie niż z tym całym przewidywaniem (?=.*)
dzięki rozwiązany problem pozdrawiam |
|
|
15.08.2012, 13:55:12
Post
#5
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) |
Kod $special = preg_match('/[^a-zA-Z0-9]'/, $entered_pass); Aż tak daleko bym ze znakami specjalnymi nie szedł. Dopuściłbym np. tylko te dostępne z klawiatury z shiftem. W Twoim przypadku dowolna litera spoza alfabetu łacińskiego (np. polskie Ń) będzie znakiem specjalnym. Co chyba nie jest najszczęśliwszym pomysłem. Poczytaj o matchowaniu znaków Unicode. Zresztą, trochę to zależy też od tego, czy piszesz w unicode, czy w ISO-8859-2 (czy nie daj Boże w Win-1250). |
|
|
15.08.2012, 20:38:54
Post
#6
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) |
mogę wcześniej oczyścić z polskich znaków np
wtedy bez względu czy ktoś użyje ą czy a i tak parser przepuści piszę w ISO-8859-2 bo z utf-8 wiecznie mam jakiś problem I tutaj dwie sprzeczne informacje wikibooks: Do porównywania wzorca z ciągiem służy funkcja preg_match(), która zwraca ilość wystąpień ciągu według podanego wzorca. http://www.gajdaw.pl/php Wynikiem funkcji jest zawsze liczba 0 lub 1, która informuje o tym, czy podane wyrażenie zostało odnalezione. jeżeli mam hasło:
to funkcja preg_match zwróci wartość 1 a w tablicy $m będzie jedynie R dlaczego funkcja nie zwraca ilości wystąpień wzorca w stringu? |
|
|
15.08.2012, 21:25:03
Post
#7
|
|
Grupa: Zarejestrowani Postów: 592 Pomógł: 62 Dołączył: 3.08.2006 Ostrzeżenie: (0%) |
manual się kłania,
preg_match zwraca 0, 1 albo FALSE, ponieważ po natknięciu się na pasujący wzorzec zatrzymuje się i nie sprawdza dalej, użyj preg_match_all jeżeli chcesz dojechać do końca -------------------- :]
|
|
|
15.08.2012, 21:33:35
Post
#8
|
|
Grupa: Zarejestrowani Postów: 228 Pomógł: 7 Dołączył: 15.08.2012 Skąd: Rzeszów Ostrzeżenie: (0%) |
Rzeczywiście dawno w niego nie zaglądałem -a bawiłem się niedawno preg_match_all -dzięki za odświeżenie mojej przyćmionej od dwóch godzin winem głowy hehe -teraz wszystko gra pozdrawiam
|
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 21:59 |