Walidacja numeru telefonu

Weryfikacja danych wprowadzanych przez użytkownika bywa równie ważna, co trudna. Łatwo się o tym przekonać szukając odpowiedniego wzorca dla adresu e-mail. Niby każdy wie, jak to powinno wyglądać: login@domena.TLD, a jednak odpowiednie wyrażenie potrafi mieć kilka tysięcy znaków.

Niedawno potrzebowałem sprawdzić numery telefonów. Szybkie wyszukiwanie w Google nie dało żadnych dobrych odpowiedzi, więc chciałbym podzielić się tym, czego dowiedziałem się rozgrzebując temat.

Ludzie kontra standardy

Miałem sporo przemyśleń podczas rejestrowania karty stałego klienta w Decathlonie. Formularz był wyjątkowo nieintuicyjny. Oczywiście, niedopuszczenie do wprowadzenia złych danych jest niezwykle ważne przy programowaniu. Z drugiej strony, jedną z podstaw projektowania, jest zwrócenie uwagi na łatwość użycia. Wymaganie konkretnego formatu danych, zwłaszcza bez jasnego zakomunikowania ograniczeń, jest frustrujące dla użytkownika.

Wracając do numeru telefonu – każdy ma swój preferowany zapis:

123-456-789 vs. 12 345 67 89 vs. (+48) 123 456 789

Odstępy, prefiks, nawiasy, to dopiero początek problemów.

Co kraj, to obyczaj

Można napisać dość proste wyrażenie regularne obsługujące tylko polskie numery, ale co z resztą świata? Tu zaczynają się schody. Na szczęście ktoś zrobił to już za nas, więc nie przedłużając przejdę do rozwiązań.

Proponowane rozwiązania

Własne wyrażenie regularne

Tak. Wiem, że to dziwna sugestia. Wszystko zależy jednak od wymagań konkretnego projektu.
Wyrażenia regularne nie są tak trudne, jakby się wydawać mogło. Jeśli nie wiesz jak je ugryźć, polecam regexone.com. Poza tym, niczego się nie nauczysz kopiując przypadkowy kod z cudzego bloga. Sam trafiłem na naprawdę tragiczne wpisy na ten temat w internecie.

Jeśli nie chcesz słuchać dobrej rady, proszę bardzo. Luźna wersja dla polskiego numeru telefonu:

/^(?:\(?\+?48)?(?:[-\.\(\)\s]*(\d)){9}\)?$/


Trzeba później usunąć wszystkie spacje i dozwolone w tym zapisie znaki specjalne (()-. itd.)

libphonenumber

Pod adresem https://github.com/googlei18n/libphonenumber można znaleźć świetną bibliotekę do weryfikacji numeru telefonu. Oficjalnie całość dostępna jest w trzech językach programowania: C++, Java i JavaScript. Istnieją także porty na C#, objective-c, Pythona, Ruby i na całe szczęście: PHP.

Uwagi

W tym wpisie nie wspomniałem o numerach wewnętrznych, które znacznie komplikują zabawę. libphonenumber ich nie obsługuje.

Żadna weryfikacja nie zastąpi wysłania kodu SMS 😉