Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Walidacja adresu e-mail przy pomocy wyrażeń regularnych
Forum PHP.pl > Forum > PHP
klorko
Witam,
Napisałem prostą funkcję do weryfikacji adresów e-mail. Nie będę się zagłębiał w szczegóły tej funkcji, ponieważ mam problem tylko w 1 miejscu z działaniem wyrażeń regularnych. Moja funkcja dzieli podany przez użytkownika adres e-mail w miejscu znaku @ na 2 łańcuchy. Interesuje mnie zweryfikowanie tylko części lokalnej adresu, bo domenę sprawdzam przy pomocy funkcji 'checkdnsrr'. Szukałem funkcji do weryfikacji e-mail w wielu różnych miejscach, ale zazwyczaj były dla mnie niewystarczające. Moja funkcja musi sprawdzać tak - część lokalna adresu wg wytycznych nie może się zaczynać od kropki, nie może się kończyć kropką i 2 kropki lub więcej nie mogą występować jedna po drugiej. W tej części adresu mogą występować następujące znaki: ! # $ % & ' * + - / = ? ^ _ ` . { | } ~ i oczywiście a-z A-Z 0-9.
Problem polega na tym, że wywołanie funkcji 'preg_match' z moim wyrażeniem regularnym daje niespodziewane dla mnie efekty. Poniżej przedstawię fragment problematycznego kodu:

$wyrazenie = '/^[a-zA-Z0-9!#\$%&\'\*\+-]{1}[a-zA-Z0-9!#$%&\'*+-\/=?^_`\.{|}~]*$/';
if(preg_match($wyrazenie, $email_nazwa)) {
$status = true;

}

Na tą chwilę interesuje mnie tylko początek wyrażenia regularnego, która sprawdza pierwszy znak adresu e-mail. Powyższy kod działa dobrze, ale po dodaniu do niego pozostałych dopuszczalnych znaków, czyli: / = ? ^ _ ` { | } ~ (oczywiście znaki, które mają specjalne znaczenie dla parsera poprzedzam znakiem ucieczki \) wyrażenie daje dziwne rezultaty. Jeśli podam adres z kropką na początku (która przecież nie występuje w moim przedziale znaków) adres jest uznawany za prawidłowy. Nie wiem dlaczego tak się dzieje.
Poza tym, czy ma ktoś pomysł na lepsze wyrażenie regularne, które sprawdza lokalną część adresu? Nie wiem też jak napisać wyrażenie, które nie pozwoli na występowanie dwóch lub więcej kropek obok siebie. Czy wyrażenia regularne podołają w tym przypadku, czy muszę napisać swoją funkcję do sprawdzania kropek?

Z góry dziękuję za wszystkie podpowiedzi.
klorko
Dziękuję bardzo wookieb za precyzyjną i wyjątkowo szybką odpowiedź!
Spędziłem nad walidacją maili naprawdę sporo czasu.
Funkcja 'filter_var' jest rewelacyjna:) Zauważyłem jednak, że nie sprawdza czy domena jest zarejestrowana. Ale to nie jest problem, bo zmienię moją funkcję w taki sposób, że:
- jeśli adres e-mail przejdzie walidację funkcją 'filter_var' to rozdzielę go na 2 łańcuchy w miejscu @
- sprawdzę domenę funkcją 'checkdnsrr'.
Jeśli e-mail przejdzie taką walidację - to już chyba mogę założyć z dużym prawdopodobieństwem, że mail jest prawidłowy.
wookieb
A tak zapytam. Po co walidujesz czy domena istnieje?
klorko
Chcę mieć pewność (oczywiście na tyle, na ile to możliwe) czy użytkownik podaje mi w formularzu prawidłowy adres z istniejącej domeny. Każdy cwaniak może sobie wpisać adres typu: mail@fdfdfdssfsf.com i bez takiej walidacji formularz to przepuści.
wookieb
Ok może i go przepuści ale tak naprawdę jeżeli ktoś podaje e-mail to najlepszą walidacją tego czy ten e-mail jest prawidłowy jest wysłanie wiadomości z jakimś linkiem (np aktywacyjnym czy coś w tym stylu). Domenę może i sprawdzisz ale loginu użytkownika już nie.
klorko
Oczywiście masz rację. Mój przykład z mailem typu: mail@fdfdfdssfsf.com to tylko 1 powód. Drugim powodem jest wykluczenie niecelowej pomyłki użytkownika przy wpisywaniu adresu. Jeśli zrobi literówkę w nazwie domeny, mój formularz to wychwyci. A jeśli użytkownik poda maila z literówką, to nawet nie dostanie maila z linkiem aktywacyjnym.
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.