Proponuję również zajrzeć do biblioteki Google „ libphonenumber ”. Wiem, że to nie jest wyrażenie regularne, ale robi dokładnie to, czego chcesz.
Na przykład rozpozna, że:
15555555555
jest możliwą liczbą, ale nie jest poprawną liczbą. Obsługuje również kraje spoza USA.
Najważniejsze funkcje:
- Parsowanie / formatowanie / sprawdzanie numerów telefonów dla wszystkich krajów / regionów świata.
getNumberType
- pobiera typ liczby na podstawie samego numeru; w stanie rozróżnić numery stacjonarne, mobilne, bezpłatne, stawki premium, wspólne koszty, VoIP i numery osobiste (o ile jest to możliwe).
isNumberMatch
- uzyskuje poziom pewności, czy dwie liczby mogą być takie same.
getExampleNumber
/ getExampleNumberByType
- podaje prawidłowe numery przykładowe dla wszystkich krajów / regionów, z opcją określenia, jaki typ przykładowego numeru telefonu jest potrzebny.
isPossibleNumber
- szybkie odgadnięcie, czy liczba jest możliwym numerem telefonu, przy użyciu tylko informacji o długości, znacznie szybciej niż pełna walidacja.
isValidNumber
- pełna weryfikacja numeru telefonu dla regionu z wykorzystaniem informacji o długości i prefiksie.
AsYouTypeFormatter
- formatuje numery telefonów w locie, gdy użytkownicy wprowadzają każdą cyfrę.
findNumbers
- wyszukuje liczby podczas wprowadzania tekstu.
PhoneNumberOfflineGeocoder
- zapewnia informacje geograficzne związane z numerem telefonu.
Przykłady
Największy problem z weryfikacją numeru telefonu polega na tym, że jest on bardzo zależny od kultury.
- Ameryka
(408) 974–2042
jest prawidłowym numerem w USA
(999) 974–2042
jest nie poprawny numer US
- Australia
0404 999 999
jest prawidłowym numerem australijskim
(02) 9999 9999
jest również prawidłowym numerem australijskim
(09) 9999 9999
jest nie poprawny numer australijski
Wyrażenie regularne jest odpowiednie do sprawdzania formatu numeru telefonu, ale tak naprawdę nie będzie w stanie sprawdzić poprawności numeru telefonu.
Sugeruję pominięcie prostego wyrażenia regularnego w celu przetestowania numeru telefonu i użycie biblioteki takiej jak Google libphonenumber
(link do projektu GitHub) .
Przedstawiamy numer libphon!
Korzystając z jednego ze swoich bardziej złożonych przykładów, 1-234-567-8901 x1234
otrzymujesz następujące dane libphonenumber
(link do demonstracji online) :
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results:
E164 format +12345678901
Original format (234) 567-8901 ext. 123
National format (234) 567-8901 ext. 123
International format +1 234-567-8901 ext. 123
Out-of-country format from US 1 (234) 567-8901 ext. 123
Out-of-country format from CH 00 1 234-567-8901 ext. 123
Czyli nie tylko uczysz się, czy numer telefonu jest prawidłowy (który jest), ale także zyskujesz spójne formatowanie numeru telefonu w swoim regionie.
Jako bonus, libphonenumber
ma również wiele zestawów danych, aby sprawdzić ważność numerów telefonów, więc sprawdzenie numeru, takiego jak +61299999999
(wersja międzynarodowa (02) 9999 9999
), zwraca jako prawidłowy numer z formatowaniem:
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() true
Formatting Results
E164 format +61299999999
Original format 61 2 9999 9999
National format (02) 9999 9999
International format +61 2 9999 9999
Out-of-country format from US 011 61 2 9999 9999
Out-of-country format from CH 00 61 2 9999 9999
libphonenumber daje również wiele dodatkowych korzyści, takich jak pobranie lokalizacji, w której numer telefonu jest wykrywany, oraz uzyskanie informacji o strefie czasowej z numeru telefonu:
PhoneNumberOfflineGeocoder Results
Location Australia
PhoneNumberToTimeZonesMapper Results
Time zone(s) [Australia/Sydney]
Ale nieprawidłowy australijski numer telefonu ( (09) 9999 9999
) zwraca, że nie jest to prawidłowy numer telefonu.
Validation Results
Result from isPossibleNumber() true
Result from isValidNumber() false
Wersja Google ma kod Java i JavaScript, ale ludzie zaimplementowali również biblioteki dla innych języków, które używają zestawu danych numeru telefonu Google i18n:
O ile nie masz pewności, że zawsze będziesz akceptować liczby z jednego regionu i zawsze będą one w jednym formacie, zdecydowanie zalecam nie pisanie własnego kodu w tym celu i używanie numeru libphonen do sprawdzania poprawności i wyświetlania numerów telefonów.