W jaki sposób dowolne wyrażenie regularne obsługuje błędy, takie jak numery poza usługą? Po prostu spróbuj zadzwonić i obsłużyć nieprawidłowy numer, tak jak inne błędy.
3
Chociaż masz rację, że wyrażenie regularne nie może tego określić, każda próba wychodząca pochłania czas i zasoby. Szybkie sprawdzenie poprawności numeru zapewnia, że oczywiście fałszywe połączenie nie blokuje cennego kanału.
Abtin Forouzandeh
1
LOL @ paxdiablo .... Myślę, że 1-800-CALL-HELP zda twój test RegExp ... lol
Buhake Sindi
1
Coś, co nie jest jasne w tym pytaniu, dotyczy tego, czy numery muszą być ważne, jeśli są wywoływane z USA lub z dowolnego kraju na świecie, ponieważ większość poniższych rozwiązań nie weryfikuje niektórych prawidłowych numerów (takich jak 0030 210 12312312 - ważny Grecki numer
dzwoniony
1
@JonHanna Zgadzam się z pewnym punktem, ale z drugiej strony, z perspektywy UX, czy nie uważasz, że jeśli użytkownik wprowadzi numer 00XX ... X, test powinien przejść? Są przypadki, w których użytkownicy (np. Osoby starsze) nawet nie wiedzą, co to jest + i jak go wpisać na klawiaturze numerycznej / telefonu. Mogę też nadal argumentować, że 00XXX to prawidłowy numer międzynarodowy (tj. W kontekście użytkownika), w którym zamiast + zastosowano kod zakończenia.
To prawidłowy format dopasowania ogólnego międzynarodowego numeru telefonu. Zastąpiłem międzynarodowy kod dostępu 011 do linii stacjonarnych w Stanach Zjednoczonych standardowym międzynarodowym kodem dostępu „+”, co czyni go obowiązkowym. Zmieniłem też minimum dla numeru krajowego na co najmniej jedną cyfrę.
Pamiętaj, że jeśli wprowadzisz liczby w tym formacie do swojej książki adresowej telefonu komórkowego, możesz z powodzeniem zadzwonić na dowolny numer z książki adresowej, bez względu na to, dokąd podróżujesz. W przypadku telefonów stacjonarnych znak plus należy zastąpić międzynarodowym kodem dostępu kraju, z którego dzwonisz.
Należy pamiętać, że NIE bierze to pod uwagę zasad krajowego planu numeracyjnego - w szczególności dopuszcza zera i jedynki w lokalizacjach, na które krajowe plany numeracyjne mogą nie zezwalać, a także dopuszcza długości numerów większe niż krajowe plany numeracyjne dla niektórych krajów (np. USA).
To nie jest ważne. Europejskie numery telefonów mogą zaczynać się od podwójnego 0 bez znaku + na początku. Tak więc numer telefonu, taki jak: +44 8984 1234 (Wielka Brytania) jest również całkowicie ważny, jeśli zostanie zapisany jako 0044 8984 1234, którego to wyrażenie regularne (a także w przypadku innych odpowiedzi) nie obsługuje.
Xeroxoid
4
W połączeniu z ulepszeniami @ fezfox (?) I zoptymalizowaną długością:^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
SamWhan
1
+1. Z punktu widzenia UX, tak, to może mieć sens, aby pozwolić 00z przodu. Z punktu widzenia programowania i konserwacji, powiedziałbym, że całkowicie w porządku jest wymuszanie wszystkich liczb na początku +lub nawet zastępowanie ich 00za +każdym razem, gdy je otrzymujesz - zwłaszcza biorąc pod uwagę, że większość ludzi jest świadoma +formatu (który z większości międzynarodowych pól wprowadzania numeru telefonu wymagają mimo wszystko). Poza tym jest to poprawka w jednej linii i znacznie bardziej czytelna. Takie podejście zapewniłoby również, że wszystkie numery telefonów mają ten sam format i sprawi, że walidacja będzie znacznie mniej podatna na błędy, dzięki czemu całość będzie łatwiejsza w utrzymaniu.
milosmns
1
A także, w "starych" czasach SMS-ów typu pre-EDGE (zwykły GSM), używanie 00nie wysyłałoby wiadomości poprawnie, podczas gdy rozpoczynanie od a +zawsze działało na całym świecie. Możemy oszaleć i uczynić to super złożonym, ale czasami można / warto porzucić kilka ograniczeń, aby ułatwić sobie życie :)
milosmns
66
Wszystkie kody krajów są zdefiniowane przez ITU. Poniższe wyrażenie regularne jest oparte na ITU-T E.164 i Aneksie do Biuletynu Operacyjnego ITU nr 930 - 15.IV.2009 . Zawiera wszystkie aktualne kody krajów i kody zarezerwowane do wykorzystania w przyszłości. Chociaż można go trochę skrócić, zdecydowałem się dołączyć każdy kod niezależnie.
Dotyczy to połączeń wychodzących z USA. W przypadku innych krajów zamień międzynarodowy kod dostępu (011 na początku wyrażenia regularnego) na dowolny odpowiedni dla planu numeracyjnego tego kraju .
Należy również zauważyć, że ITU E.164 definiuje maksymalną długość pełnego międzynarodowego numeru telefonu do 15 cyfr. Oznacza to, że trzycyfrowy kod kraju daje do 12 dodatkowych cyfr, a jednocyfrowy kod kraju może zawierać do 14 dodatkowych cyfr. Stąd
[0-9]{0,14}$
a koniec wyrażenia regularnego.
Co najważniejsze, to wyrażenie regularne nie oznacza, że numer jest ważny - każdy kraj definiuje swój własny wewnętrzny plan numeracji. To tylko gwarantuje, że kod kraju jest ważny.
Prawie miał rację… „011” nie jest częścią międzynarodowego kodu. Właśnie tego potrzebują ludzie w USA, aby wykonać połączenie międzynarodowe. Ten prefiks zmieni się w zależności od tego, skąd dzwonisz ... Więc ten prefiks NIE jest częścią numeru.
Gabriel Magana,
3
@gmagana - Wspominam o tym w mojej odpowiedzi (akapit 2)
Abtin Forouzandeh
1
Chodzi mi o to, że nie jest to część numeru telefonu. To tak, jakby powiedzieć, że prefiks krajowego numeru zamiejscowego „1” jest częścią numeru telefonu.
Gabriel Magana
1
@gmagana - chociaż masz rację, że nie jest to część numeru telefonu, to jest technicznie wymagane do wykonania połączenia.
Abtin Forouzandeh
2
@Roger Pate: Spędziłem trochę czasu, zastanawiając się nad tym i mam nadzieję, że przyda się to innym. Miałem też nadzieję, że ktoś inny może mieć lepsze rozwiązanie (dlatego nie oznaczyłem własnej odpowiedzi jako zaakceptowaną).
(i) dopuszcza ważne międzynarodowe prefiksy
(ii), po których następuje 9 lub 10 cyfr, z dowolnym rodzajem lub umiejscowieniem ograniczników (z wyjątkiem między dwiema ostatnimi cyframi)
Wiem, że to stara odpowiedź, ale czy jest jakaś opcja, aby cyfra 1 była opcjonalna dla liczb amerykańskich?
Adam Fratino
To, co chcesz zrobić, to (i) uczynić „+” opcjonalnym i (ii) opcjonalnym kodem międzynarodowym. Więc umieść „?” po znaku + i po pierwszym nawiasie zamykającym.
fezfox
@ManosPasgiannis cóż, tak, jak określono „po czym następuje 9 lub 10 cyfr”. Na Cyprze pojawiłby się 8, więc po prostu dostosuj ostatnią sekwencję, usuwając raz wystąpienie \ d \ W * i wykonaj ostatnie wyrażenie (\ d {1,3})
fezfox
22
Możesz skorzystać z biblioteki libphonenumber firmy Google.
To mogłoby być dobre rozwiązanie, ale aby sprawdzić numery telefonów, przed skorzystaniem z tej biblioteki musisz zaimportować ogromną ilość js ... ponieważ libphonenumber.js wymaga biblioteki zamykania ... to nie jest lekkie rozwiązanie: /
Działa jak marzenie. Również dla holenderskich numerów telefonów. Dzięki!
mauvm
2
Jest oczywiście wiele sposobów, aby to zrobić, o czym świadczą wszystkie odpowiedzi udzielone do tej pory, ale wrzucę tutaj moją wartość 0,02 USD i przedstawię poniżej wyrażenie regularne, które jest nieco bardziej zwięzłe niż prawie wszystkie powyższe , ale dokładniej niż większość. Ma również fajny efekt uboczny polegający na pozostawieniu kodu kraju w 1 USD i numeru lokalnego w 2 USD.
Bez krytykowania tych wspaniałych odpowiedzi, chcę tylko przedstawić proste rozwiązanie, którego używam dla naszych twórców treści dla administratorów:
^(\+|00)[1-9][0-9 \-\(\)\.]{7,}$
Siła zacznij od plusa lub dwóch zer i użyj przynajmniej trochę liczb, spacji, nawiasów klamrowych, minus i kropki są opcjonalne i nie ma innych znaków. Możesz bezpiecznie usunąć wszystkie nie-liczby i użyć tego w tel: input. Liczby będą miały wspólną formę reprezentacji i nie muszę się martwić, że będę zbyt restrykcyjny.
publicstaticboolean validateInternationalPhoneNumberFormat(String phone){StringBuilder sb =newStringBuilder(200);// Country code
sb.append("^(\\+{1}[\\d]{1,3})?");// Area code, with or without parentheses
sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");// Phone number separator can be "-", "." or " "// Minimum of 5 digits (for fixed line phones in Solomon Islands)
sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");// 4 more optional digits
sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");returnPattern.compile(sb.toString()).matcher(phone).find();}
Chociaż ten fragment kodu może odpowiedzieć na pytanie, nie zapewnia żadnego kontekstu wyjaśniającego, jak i dlaczego. Rozważ dodanie jednego lub dwóch zdań, aby wyjaśnić swoją odpowiedź.
brandonscript
1
Oto wyrażenie regularne dla następujących najbardziej typowych scenariuszy numerów telefonów. Chociaż jest to dostosowane z perspektywy USA dla numerów kierunkowych, działa w scenariuszach międzynarodowych.
Rzeczywista liczba powinna składać się tylko z 10 cyfr.
W przypadku numerów w USA numer kierunkowy może być ujęty w nawiasy ().
Kod kraju może mieć od 1 do 3 cyfr. Opcjonalnie może być poprzedzony znakiem +.
Pomiędzy kodem kraju, numerem kierunkowym a resztą numeru mogą występować myślniki, spacje, kropki lub nie mogą być spacje.
Prawidłowy numer telefonu nie może składać się z samych zer.
^- start of expression
(?!\b(0)\1+\b)-(?!)NegativeLook ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group(zero).Basically don't match all zeros.
(\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[.-]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.
\(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.
([. -]?) - optional space, dash or dot
$ - end of expression
Odpowiada to liczbom, które mają dokładnie 12 cyfr, łącznie z kodem kraju. To jest złe, ponieważ nie uwzględnia zmienności długości na całym świecie. Ponadto maksymalna długość to w rzeczywistości 15 cyfr .
Odpowiedzi:
To prawidłowy format dopasowania ogólnego międzynarodowego numeru telefonu. Zastąpiłem międzynarodowy kod dostępu 011 do linii stacjonarnych w Stanach Zjednoczonych standardowym międzynarodowym kodem dostępu „+”, co czyni go obowiązkowym. Zmieniłem też minimum dla numeru krajowego na co najmniej jedną cyfrę.
Pamiętaj, że jeśli wprowadzisz liczby w tym formacie do swojej książki adresowej telefonu komórkowego, możesz z powodzeniem zadzwonić na dowolny numer z książki adresowej, bez względu na to, dokąd podróżujesz. W przypadku telefonów stacjonarnych znak plus należy zastąpić międzynarodowym kodem dostępu kraju, z którego dzwonisz.
Należy pamiętać, że NIE bierze to pod uwagę zasad krajowego planu numeracyjnego - w szczególności dopuszcza zera i jedynki w lokalizacjach, na które krajowe plany numeracyjne mogą nie zezwalać, a także dopuszcza długości numerów większe niż krajowe plany numeracyjne dla niektórych krajów (np. USA).
źródło
^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
00
z przodu. Z punktu widzenia programowania i konserwacji, powiedziałbym, że całkowicie w porządku jest wymuszanie wszystkich liczb na początku+
lub nawet zastępowanie ich00
za+
każdym razem, gdy je otrzymujesz - zwłaszcza biorąc pod uwagę, że większość ludzi jest świadoma+
formatu (który z większości międzynarodowych pól wprowadzania numeru telefonu wymagają mimo wszystko). Poza tym jest to poprawka w jednej linii i znacznie bardziej czytelna. Takie podejście zapewniłoby również, że wszystkie numery telefonów mają ten sam format i sprawi, że walidacja będzie znacznie mniej podatna na błędy, dzięki czemu całość będzie łatwiejsza w utrzymaniu.00
nie wysyłałoby wiadomości poprawnie, podczas gdy rozpoczynanie od a+
zawsze działało na całym świecie. Możemy oszaleć i uczynić to super złożonym, ale czasami można / warto porzucić kilka ograniczeń, aby ułatwić sobie życie :)Wszystkie kody krajów są zdefiniowane przez ITU. Poniższe wyrażenie regularne jest oparte na ITU-T E.164 i Aneksie do Biuletynu Operacyjnego ITU nr 930 - 15.IV.2009 . Zawiera wszystkie aktualne kody krajów i kody zarezerwowane do wykorzystania w przyszłości. Chociaż można go trochę skrócić, zdecydowałem się dołączyć każdy kod niezależnie.
Dotyczy to połączeń wychodzących z USA. W przypadku innych krajów zamień międzynarodowy kod dostępu (011 na początku wyrażenia regularnego) na dowolny odpowiedni dla planu numeracyjnego tego kraju .
Należy również zauważyć, że ITU E.164 definiuje maksymalną długość pełnego międzynarodowego numeru telefonu do 15 cyfr. Oznacza to, że trzycyfrowy kod kraju daje do 12 dodatkowych cyfr, a jednocyfrowy kod kraju może zawierać do 14 dodatkowych cyfr. Stąd
a koniec wyrażenia regularnego.
Co najważniejsze, to wyrażenie regularne nie oznacza, że numer jest ważny - każdy kraj definiuje swój własny wewnętrzny plan numeracji. To tylko gwarantuje, że kod kraju jest ważny.
źródło
To jest dalsza optymalizacja.
(i) dopuszcza ważne międzynarodowe prefiksy
(ii), po których następuje 9 lub 10 cyfr, z dowolnym rodzajem lub umiejscowieniem ograniczników (z wyjątkiem między dwiema ostatnimi cyframi)
To będzie pasować:
+ 1-234-567-8901
+ 61-234-567-89-01
+ 46-234 5678901
+1 (234) 56 89 901
+1 (234) 56-89 901
+46.234.567.8901
+1 / 234/567/8901
źródło
Możesz skorzystać z biblioteki libphonenumber firmy Google.
źródło
To zadziała w przypadku numerów międzynarodowych;
DO#:
JS:
źródło
Używam tego:
Zalety: rozpoznaje początki + lub 011, pozwala na tak długo, jak potrzeba i obsługuje wiele konwencji rozszerzeń. (#, x, ext, extension)
źródło
Oto „zoptymalizowana” wersja Twojego wyrażenia regularnego:
Możesz zamienić
\d
s na,[0-9]
jeśli twoja składnia wyrażeń regularnych nie obsługuje\d
.źródło
W przypadku iOS SWIFT uznałem to za pomocne,
źródło
Zmodyfikowane wyrażenie regularne @ Erica - dodano listę wszystkich kodów krajów ( pobrane z xxxdepy @ Github . Mam nadzieję, że okażą się pomocne:
źródło
Jest oczywiście wiele sposobów, aby to zrobić, o czym świadczą wszystkie odpowiedzi udzielone do tej pory, ale wrzucę tutaj moją wartość 0,02 USD i przedstawię poniżej wyrażenie regularne, które jest nieco bardziej zwięzłe niż prawie wszystkie powyższe , ale dokładniej niż większość. Ma również fajny efekt uboczny polegający na pozostawieniu kodu kraju w 1 USD i numeru lokalnego w 2 USD.
^ \ + (? = \ d {5,15} $) (1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1–469] | 9 [0–58] | [2–9] ..) (\ d +) $
źródło
Bez krytykowania tych wspaniałych odpowiedzi, chcę tylko przedstawić proste rozwiązanie, którego używam dla naszych twórców treści dla administratorów:
Siła zacznij od plusa lub dwóch zer i użyj przynajmniej trochę liczb, spacji, nawiasów klamrowych, minus i kropki są opcjonalne i nie ma innych znaków. Możesz bezpiecznie usunąć wszystkie nie-liczby i użyć tego w tel: input. Liczby będą miały wspólną formę reprezentacji i nie muszę się martwić, że będę zbyt restrykcyjny.
źródło
Prosta wersja dla numerów europejskich, która pasuje do numerów takich jak 0034617393211, ale także długich, takich jak 004401484172842.
Mam nadzieję, że to pomoże :·)
źródło
źródło
Oto wyrażenie regularne dla następujących najbardziej typowych scenariuszy numerów telefonów. Chociaż jest to dostosowane z perspektywy USA dla numerów kierunkowych, działa w scenariuszach międzynarodowych.
Prawidłowy numer telefonu nie może składać się z samych zer.
Wyjaśnienie:
Więcej przykładów i wyjaśnień - https://regex101.com/r/hTH8Ct/2/
źródło
Użyłem tego poniżej:
Format + CCC.NNNNNNNNNNxEEE lub 00CCC.NNNNNNNNNNxEEEE
Numer telefonu musi zaczynać się od „+” lub „00” w przypadku połączenia międzynarodowego. gdzie C to 1–3 cyfrowy kod kraju,
N ma maksymalnie 14 cyfr,
a E to (opcjonalne) rozszerzenie.
Początkowy znak plus i kropka po kodzie kraju są wymagane. Literalny znak „x” jest wymagany tylko wtedy, gdy podano rozszerzenie.
źródło
Wypróbuj następujący interfejs API, aby sprawdzić poprawność numeru telefonu. Zwróci to również kraj, obszar i dostawcę
demo https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0
źródło
Międzynarodowy plan numeracji jest oparty na ITU E.164 planie numeracji . Myślę, że to jest punkt wyjścia dla twojego wyrażenia regularnego.
Zaktualizuję to, jeśli obejdę się, aby utworzyć wyrażenie regularne na podstawie numeracji ITU E.164.
źródło
To wyrażenie Regex działa dla numerów telefonów Indii, Kanady, Europy, Nowej Zelandii, Australii i Stanów Zjednoczonych wraz z ich kodami krajów:
"^(\+(([0-9]){1,2})[-.])?((((([0-9]){2,3})[-.]){1,2}([0-9]{4,10}))|([0-9]{10}))$"
źródło
To działa dla mnie, ale bez prefiksu 00, 001, 0011 itp .:
źródło
Mimo że tak naprawdę nie jest to użycie RegExp do wykonania pracy - a może właśnie dlatego - wygląda to na fajne rozwiązanie: https://intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
źródło
Spróbuj tego, to działa dla mnie.
źródło
Stworzyłem wyrażenie regularne dla europejskich numerów telefonów i jest ono specyficzne dla prefiksu wybierania względem długości numeru.
źródło
Spróbuj tego, nie wiem, czy istnieje numer telefonu dłuższy niż 12:
źródło
^(00|\+){1}\d{12,15}$
to?