Park Stołeczny, Emanuel Śmigło, 06.01.2012 r. o 07:44
Kącik Kodera II

Walidacji ciąg dalszy
W dzisiejszym odcinku Kąciku Kodera, zgodnie z zapowiedzią, przedstawię walidację pola odbiorcy przelewu dla systemu Złota Wolność oraz dwa podejścia do weryfikacji adresu e-mail.

Odbiorca przelewu
Wpierw tematyka bankowa, czyli szukanie odpowiedniego wzorca dla wyrażenia regularnego. Szybkie przejrzenie listy instytucji uświadomi nas, że musimy uwzględnić dwie opcje, obie z haczykami:
- odbiorca jest mieszkańcem (uwaga na Teutonów!),
- odbiorca jest instytucją (małe odstępstwo doda nam pracy).

Ogółem musimy obsłużyć cztery wzorce na zasadzie alternatywy. Zamiast zgłębiania wiedzy możemy posłużyć się "sprytem" i napisać cztery wyrażenia sprawdzane w kolejnych blokach if-else. Dla niektórych ludzi jest to wystarczające rozwiązanie, bo działa. Kącik Kodera powstał dla wyższych celów, więc wykorzystamy siłę regex poszukując alternatywy (dosłownie). Odpowiednim znakiem w języku wyrażeń regularnych jest |. Czary-mary, hokus-krokus, jeb:
"/^(A(A-Z0-9){1}d{3})|((KST){1}d{4})$/"

OMG, WTF?!
Na pierwszy rzut oka wygląda to dość nieciekawie, dlatego postaram się wyjaśnić jak to ugryźć:
- d - zbiór cyfr,
- lewą część alternatywy: duża litera A, jeden element ze zbioru dużych liter alfabetu i cyfr, 3 elementy ze zbioru cyfr,
- prawą część alternatywy: jeden element ze zbioru {K, S, T}, cztery elementy ze zbioru cyfr,
- jak poprzednio pamiętamy, że nawiasy kwadratowe określające zbiory znaków zostały zastąpione zwykłymi.

W porównaniu do poprzedniego odcinka KK uzyskaliśmy lepszy wzorzec dla identyfikatora mieszkańca. On zrobi swoje, a my dodatkowo sprawdzimy wejście czy jest godne odpalenia naszej kosiarki usuwając znaki białe z początku i końca tekstu, a długość otrzymanego łańcucha znaków porównamy do z góry znanej wartości:

function ValidateRecipient($recipient) {
return (strlen(trim($recipient)) === 5) ?
preg_match("/^(A(A-Zd){1}d{3})|((KST){1}d{4})$/", $recipient) === 1) :
FALSE;
}

Jeżeli czytelnik nie zna operatora trójargumentowego ? : to zapraszam do lektury.

Poczta, milordzie
W sieci można znaleźć mnóstwo gotowych wyrażeń regularnych starających się poprawnie odwzorować składnię adresu e-mail zgodnie z dokumentami RFC. Autor nie jest aż takim masochistą, by przeprowadzać testy porównawcze wszystkich regex opatrzonych hasłem de best, niestety. Jak jeden z czytelników słusznie zauważył język PHP od wersji 5.2 wprowadził funkcję filter_var. Wywołanie:

filter_var("bob@example.com", FILTER_VALIDATE_EMAIL);

odpali za kulisami tego potwora, ponoć najstraszniejszego, który sprawdzi za nas poprawność składni. Jesteśmy wspaniali, sprawdźmy jeszcze czy domena określona w adresie faktycznie istnieje w sieci (korzystając z funkcji checkdnsrr):

function ValidateEmail($email) {
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
return FALSE;
$atIndex = strrpos($email, "@");
$domain = substr($email, $atIndex + 1);
if (checkdnsrr($domain, "MX" ))
return TRUE;
return checkdnsrr($domain, "A");
}

Przedstawiona funkcja sprawdzi poprawność składni oraz faktyczne istnienie domeny adresu e-mail w sieci. Otwartą kwestią pozostaje sprawa funkcjonowania konta pocztowego określonego zadanym adresem. Należy mieć na uwadze, iż czas wykonania funkcji odpytujących zasoby sieciowe może zajmować zdecydowanie więcej czasu niż przetwarzanie wyrażeń regularnych. Wymogi aplikacji powinny determinować akceptowalny czas działania konkretnego skryptu.

Kolejny odcinek Kąciku Kodera będzie dotyczył funkcji skrótu. Dziurawego kodu!
Dotacje
0,00 lt
Nikt jeszcze nie zasponsorował tego artykułu.
Serduszka
0,00 lt
Nikt jeszcze nie lubi tego artykułu.
Komentarze
Marek von Thorn-Chojnacki
To ci no, dopiero:D
Odpowiedz Permalink
Mikołaj Jan
Lubię to. Aczkolwiek czuję się głupi jak czytam...
Permalink
Kedar via Margończyk
wow ale się zmieniło w nowym php, jestem strasznie do tyłu znów :(
Permalink
Emanuel Śmigło
Ciekawe czy ktoś tu zagląda?
Permalink
Emanuel Śmigło
fake.png[img]onerror=javascript:alert(String.fromCharCode(88,83,83))[/img]
Permalink

Musisz się zalogować, by móc dodawać komentarze.