Usiłuję stworzyć kompleksowe wyrażenie regularne do sprawdzania poprawności numerów telefonów. Idealnie byłoby obsługiwać formaty międzynarodowe, ale musi obsługiwać formaty amerykańskie, w tym następujące:
1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
Odpowiem moją obecną próbą, ale mam nadzieję, że ktoś ma coś lepszego i / lub bardziej eleganckiego.
regex
validation
phone-number
Nicholas Trandem
źródło
źródło
555
oprócz wszystkich amerykańskich numerów telefonów nie są w nich wymagane911
?Odpowiedzi:
Lepsza opcja ... po prostu usuń wszystkie znaki inne niż cyfry na wejściu (z wyjątkiem „x” i wiodących znaków „+”), uważając ze względu na brytyjską tendencję do pisania liczb w niestandardowej formie,
+44 (0) ...
gdy poproszony o użycie prefiksu międzynarodowego (w tym konkretnym przypadku należy(0)
całkowicie odrzucić ).Następnie otrzymujesz wartości takie jak:
Następnie, kiedy wyświetlisz, sformatuj do swoich serc. na przykład
źródło
Okazuje się, że istnieje coś takiego, przynajmniej dla Ameryki Północnej, zwanej NANP .
Musisz dokładnie określić, co chcesz. Co to są prawne ograniczniki? Spacje, myślniki i kropki? Ogranicznik nie jest dozwolony? Czy można mieszać ograniczniki (np. + 0,1111-222,3333)? Jak będą obsługiwane rozszerzenia (np. 111-222-3333 x 44444)? Co z numerami specjalnymi, takimi jak 911? Czy numer kierunkowy będzie opcjonalny czy wymagany?
Oto wyrażenie regularne dla 7 lub 10 cyfr, z dozwolonymi rozszerzeniami, ogranicznikami są spacje, myślniki lub kropki:
źródło
/(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/
(?:(?:(\s*\(?([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\)?\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})
Jeśli użytkownicy chcą podać ci swoje numery telefonów, zaufaj im, że dobrze to zrobią. Jeśli nie chcą ci tego dać, to zmuszenie ich do podania prawidłowego numeru spowoduje wysłanie ich na stronę konkurenta lub wprowadzenie losowego ciągu pasującego do wyrażenia regularnego. Może nawet pokusę się o sprawdzenie numeru infolinii o podwyższonej opłacie i wpisanie go zamiast tego.
Za prawidłowy wpis na stronie uważam również:
źródło
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:
jest możliwą liczbą, ale nie jest poprawną liczbą. Obsługuje również kraje spoza USA.
Najważniejsze funkcje:
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.
(408) 974–2042
jest prawidłowym numerem w USA(999) 974–2042
jest nie poprawny numer US0404 999 999
jest prawidłowym numerem australijskim(02) 9999 9999
jest również prawidłowym numerem australijskim(09) 9999 9999
jest nie poprawny numer australijskiWyraż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 danelibphonenumber
(link do demonstracji online) :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: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:
Ale nieprawidłowy australijski numer telefonu (
(09) 9999 9999
) zwraca, że nie jest to prawidłowy numer telefonu.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.
źródło
07700000000
sięMissing or invalid default region.
błąd. Ale jeśli podam kod kraju, przejdzie./^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i
To pasuje:
Na $ n oszczędza:
Możesz to przetestować na https://www.regexpal.com/?fam=99127
źródło
^
a$
ja będę w stanie obejść to za pomocą[111] [111] [1111]
lub111--111--1111
podobnego. (przepraszam,^
i$
?[111] [111] [1111]
i111--111--1111
aż usunąłem^
i$
od regex.Chociaż odpowiedź na usunięcie wszystkich białych znaków jest zgrabna, to tak naprawdę nie rozwiązuje postawionego problemu, jakim jest znalezienie wyrażenia regularnego. Weźmy na przykład mój skrypt testowy, który pobiera stronę internetową i wyodrębnia wszystkie numery telefonów za pomocą wyrażenia regularnego. Ponieważ i tak potrzebujesz wyrażenia regularnego, równie dobrze możesz zlecić wykonanie wyrażenia regularnego. Wymyśliłem to:
Oto skrypt Perla, aby go przetestować. Po uzgodnieniu 1 USD zawiera numer kierunkowy, 2 USD i 3 USD numer telefonu, a 5 USD zawiera rozszerzenie. Mój skrypt testowy pobiera plik z Internetu i drukuje w nim wszystkie numery telefonów.
Edytować:
Możesz zmienić \ W * na \ s * \ W? \ S * w wyrażeniu regularnym, aby go nieco zaostrzyć. Kiedy pisałem, nie myślałem o wyrażeniu regularnym w kategoriach, powiedzmy, sprawdzania poprawności danych wprowadzonych przez użytkownika w formularzu, ale ta zmiana umożliwia użycie wyrażenia regularnego w tym celu.
źródło
(4570457-6789
co byłoby dość powszechną literówką. Grupy meczów również są wypaczone: rubular.com/r/TaTP0mHL5c(^|[^\d\n])
(z włączoną flagą wielowierszową) pozwala uniknąć ogólnego problemu, zapewniając, że nie zostanie natychmiast poprzedzony czymś liczbowym.Odpowiedziałem na to pytanie w innym pytaniu SO, zanim zdecydowałem się dołączyć moją odpowiedź jako odpowiedź w tym wątku, ponieważ nikt nie zajmował się tym, jak wymagać / nie wymagać przedmiotów, po prostu rozdając wyrażenia regularne: Regex działa źle, dopasowując nieoczekiwane rzeczy
Na podstawie mojego postu na tej stronie stworzyłem krótki przewodnik, aby pomóc każdemu w tworzeniu własnego wyrażenia regularnego dla własnego pożądanego formatu numeru telefonu, co zastrzegam (tak jak na drugiej stronie), że jeśli jesteś zbyt restrykcyjny, możesz nie uzyskać pożądanych rezultatów i nie istnieje jedno uniwersalne rozwiązanie do akceptowania wszystkich możliwych numerów telefonów na świecie - tylko to, co zdecydujesz się zaakceptować jako swój wybrany format. Używaj na własne ryzyko.
Szybki ściągawki
/^
[\s]
lub\s
[(]
i[)]
. Używanie\(
i\)
jest brzydkie i może powodować zamieszanie.?
po nim-
lub[-]
. Jeśli jednak nie umieścisz go na początku lub na końcu w szeregu innych postaci, być może będziesz musiał uciec:\-
[-.\s]
będzie wymagał łącznika, kropki lub spacji. Znak zapytania po ostatnim nawiasie spowoduje, że wszystkie te będą opcjonalne dla tego miejsca.\d{3}
: Wymaga trzycyfrowego numeru: 000-999. Stenografia dla[0-9][0-9][0-9]
.[2-9]
: Wymaga cyfry 2-9 dla tego gniazda.(\+|1\s)?
: Zaakceptuj „plus” lub 1 i spację (znak potoku|
,, to „lub”) i ustaw ją jako opcjonalną. Znak „plus” należy usunąć.[246]
będzie wymagać 2, 4 lub 6.[77|78]
będzie wymagać 77 lub 78.$/
: Zakończenie wyrażeniaźródło
[2-9]
blok, który tam umieściłem. Oznacza to, że twoja min wynosi 2, a maksymalna to 9. Dostosuj odpowiednio.Pisałem najprościej (chociaż nie potrzebowałem w nim kropki).
Jak wspomniano poniżej, sprawdza tylko znaki, a nie ich strukturę / kolejność
źródło
Jeśli chcesz tylko sprawdzić, czy nie masz przypadkowych śmieci w polu (tj. Od spamerów formularzy), to wyrażenie regularne powinno zrobić dobrze:
Zauważ, że nie ma żadnych specjalnych reguł dotyczących liczby cyfr lub jakie liczby są prawidłowe w tych cyfrach, po prostu sprawdza, czy tylko cyfry, nawiasy, myślniki, plus, spacja, funt, gwiazdka, kropka, przecinek lub litery
e
,x
,t
są obecne.Powinien być zgodny z międzynarodowymi numerami i formatami lokalizacji. Czy przewidujesz potrzebę dopuszczenia nawiasów kwadratowych, kręconych lub kątowych w niektórych regionach? (obecnie nie są uwzględnione).
Jeśli chcesz zachować zasady dotyczące cyfr (np. W amerykańskich numerach kierunkowych i prefiksach (kody wymiany) muszą mieścić się w przedziale 200–999), powodzenia. Utrzymywanie złożonego zestawu reguł, który może być przestarzały w dowolnym momencie w przyszłości przez jakikolwiek kraj na świecie, nie brzmi zabawnie.
I chociaż usuwanie wszystkich / większości znaków nienumerycznych może działać dobrze po stronie serwera (zwłaszcza jeśli planujesz przekazywać te wartości do dialera), możesz nie chcieć podważyć danych użytkownika podczas sprawdzania poprawności, szczególnie jeśli chcesz, aby wprowadź poprawki w innym polu.
źródło
Pamiętaj, że usuwanie
()
znaków nie działa w przypadku powszechnego stylu pisania liczb brytyjskich:+44 (0) 1234 567890
co oznacza wybranie numeru międzynarodowego:+441234567890
lub wybrania brytyjskiego
01234567890
źródło
Czy rzuciłeś okiem na RegExLib ?
Wpisanie amerykańskiego numeru telefonu przyniosło całkiem sporo możliwości.
źródło
Moja próba nieograniczonego wyrażenia regularnego:
Akceptuje:
Odrzuca:
Twoim zadaniem jest oczyszczenie go w celu wyświetlenia. Po sprawdzeniu poprawności może to być liczba.
źródło
Uważam, że działa całkiem dobrze:
Działa dla tych formatów liczb:
Upewnij się, że używasz flag globalnych ORAZ multilinii, aby się upewnić.
Link: http://www.regexr.com/3bp4b
źródło
Jeśli mówisz o sprawdzaniu poprawności formularzy, wyrażenie regularne sprawdzania poprawności znaczenia i poprawności danych będzie niezwykle skomplikowane ze względu na różne standardy kraju i dostawcy. Trudno będzie również być na bieżąco.
Interpretuję to pytanie jako szukanie ogólnie poprawnego wzorca, który może nie być wewnętrznie spójny - na przykład posiadający prawidłowy zestaw liczb, ale nie sprawdzający poprawności linii miejskiej, wymiany itp. Na prawidłowy wzorzec dla prefiksu kodu kraju .
Ameryka Północna jest prosta, a dla międzynarodowych wolę stosować wzór „idiomatyczny”, który obejmuje sposoby określania i zapamiętywania swoich liczb:
Wzór północnoamerykański zapewnia, że jeśli uwzględniony zostanie jeden nawias, oba są. Konta międzynarodowe dla opcjonalnego początkowego „+” i kodu kraju. Potem jesteś w idiomie. Prawidłowe dopasowania to:
(xxx)xxx-xxxx
(xxx)-xxx-xxxx
(xxx)xxx-xxxx x123
12 1234 123 1 x1111
12 12 12 12 12
12 1 1234 123456 x12345
+12 1234 1234
+12 12 12 1234
+12 1234 5678
+12 12345678
Może to być stronnicze, ponieważ moje doświadczenie jest ograniczone do Ameryki Północnej, Europy i niewielkiej części Azji.
źródło
invalid quantifier
błąd. Jakieś pomysły na to, co robię źle?Oto wspaniały wzór, który najbardziej pasował do walidacji, którą musiałem osiągnąć. Nie jestem oryginalnym autorem, ale myślę, że warto się nim podzielić, ponieważ uznałem ten problem za bardzo złożony i bez zwięzłej lub bardzo użytecznej odpowiedzi.
Poniższy regex złapie powszechnie używane kombinacje liczb i znaków w różnych globalnych formatach numerów telefonów:
/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm
Pozytywne:
+42 555.123.4567
+ 1- (800) -123-4567
+7 555 1234567
+7 (926) 1234567
(926) 1234567
+79261234567
926 1234567
9261234567
1234567
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8 (926) 1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678 1416555
9292
Negatywny:
926 3 4
8 800 600-APPLE
Oryginalne źródło: http://www.regexr.com/38pvb
źródło
Moje przeczucie jest wzmocnione ilością odpowiedzi na ten temat - że istnieje praktycznie nieskończona liczba rozwiązań tego problemu, z których żadne nie będzie eleganckie.
Szczerze mówiąc, nie polecam sprawdzania poprawności numerów telefonów. Nawet gdybyś mógł napisać duży, włochaty walidator, który pozwalałby na stosowanie różnych legalnych formatów, ostatecznie pozwoliłby na prawie wszystko, nawet zdalnie przypominając numer telefonu.
Moim zdaniem najbardziej eleganckim rozwiązaniem jest sprawdzenie minimalnej długości, nic więcej.
źródło
Jest to prosty wzór wyrażeń regularnych dla filipińskich numerów telefonów komórkowych:
lub
dopasuje te:
Pierwszy będzie pasował do KAŻDEGO dwucyfrowego kodu kraju, a drugi będzie pasował wyłącznie do filipińskiego kodu kraju.
Przetestuj tutaj: http://refiddle.com/1ox
źródło
Oto moja najlepsza jak dotąd próba. Obsługuje powyższe formaty, ale jestem pewien, że brakuje mi innych możliwych formatów.
źródło
Trudno będzie ci mierzyć się z numerami międzynarodowymi za pomocą jednego / prostego wyrażenia regularnego, zobacz ten post na temat trudności związanych z międzynarodowymi (a nawet północnoamerykańskimi) numerami telefonów.
Będziesz musiał przeanalizować kilka pierwszych cyfr, aby określić kod kraju, a następnie postępować inaczej w zależności od kraju.
Poza tym - podana przez ciebie lista nie zawiera innego wspólnego formatu w USA - pomijając początkową 1. Większość telefonów komórkowych w USA tego nie wymaga i zacznie niepokoić młode pokolenie, chyba że wybierze numer międzynarodowy.
Prawidłowo zidentyfikowałeś, że jest to trudny problem ...
-Adam
źródło
Po przeczytaniu tych odpowiedzi wygląda na to, że nie było prostego wyrażenia regularnego, które byłoby w stanie przeanalizować kilka tekstów i wyciągnąć numery telefonów w dowolnym formacie (w tym międzynarodowym ze znakiem plus i bez niego).
Oto, czego ostatnio użyłem w projekcie klienta, w którym musieliśmy przekonwertować wszystkie numery telefonów w dowolnym formacie na tel: linki.
Do tej pory działało ze wszystkim, co na niego rzucili, ale jeśli pojawią się błędy, zaktualizuję tę odpowiedź.
Regex:
/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/
Funkcja PHP zastępująca wszystkie numery telefonów linkami tel: (na wypadek, gdyby ktoś był ciekawy):
źródło
+1 1234562222222222222222222222
.Wierzę, że moduły Perla mogą pomóc w modułach :: Number :: Phone :: US i Regexp :: Common (szczególnie źródło Regexp :: Common :: URI :: RFC2806 ).
Pytanie powinno być prawdopodobnie określone bardziej szczegółowo, aby wyjaśnić cel sprawdzania poprawności liczb. Na przykład 911 jest poprawną liczbą w USA, ale 911x nie jest dla żadnej wartości x. Dzięki temu firma telefoniczna może obliczyć, kiedy wybierasz numer. Istnieje kilka odmian tego problemu. Ale wyrażenie regularne nie sprawdza części kodu obszaru, więc nie wydaje się to problemem.
Podobnie jak sprawdzanie poprawności adresów e-mail, nawet jeśli masz prawidłowy wynik, nie możesz wiedzieć, czy jest on przypisany do kogoś, dopóki nie spróbujesz.
Jeśli próbujesz zweryfikować dane wprowadzone przez użytkownika, dlaczego nie znormalizować wyniku i zrobić to z nim? Jeśli użytkownik wpisze liczbę, której nie można rozpoznać jako prawidłową, albo zapisz ją jako wprowadzoną, albo usuń znaki, których nie można pokonać. Moduł Number :: Phone :: Normalize Perl może być źródłem inspiracji.
źródło
Pracuję dla firmy zajmującej się badaniami rynku i musimy cały czas filtrować tego rodzaju dane wejściowe. Za bardzo to komplikujesz. Po prostu usuń znaki niealfanumeryczne i sprawdź, czy istnieje rozszerzenie.
W celu dalszej analizy możesz zapisać się do jednego z wielu dostawców, którzy dadzą ci dostęp do bazy ważnych numerów, a także powiedzą ci, czy są to telefony stacjonarne czy komórkowe, odłączone itp. To kosztuje.
źródło
Wykonaj zamianę formatowania znaków, a następnie sprawdź pozostałe pod kątem ważności telefonu. W PHP
Złamanie tak złożonego wyrażenia regularnego może być równie skuteczne, ale o wiele prostsze.
źródło
Uważam to za coś interesującego. Nie testowałem tego, ale wygląda na to, że zadziałałoby
źródło
Prawdopodobnie lepiej byłoby użyć do tego maskowanego wejścia. W ten sposób użytkownicy mogą TYLKO wprowadzać liczby i możesz formatować według własnego uznania. Nie jestem pewien, czy jest to aplikacja internetowa, ale jeśli tak, to istnieje wtyczka jQuery bardzo klikająca, która oferuje pewne opcje.
http://digitalbush.com/projects/masked-input-plugin/
W swoim tutorialu zastanawiają się nawet, jak maskować wprowadzane numery telefonów.
źródło
Oto taki, który działa dobrze w JavaScript. Jest w ciągu, ponieważ tego oczekiwał widżet Dojo.
Pasuje do 10-cyfrowego numeru NANP w Ameryce Północnej z opcjonalnym rozszerzeniem. Spacje, myślniki i kropki są akceptowanymi ogranicznikami.
źródło
Walczyłem z tym samym problemem, próbując uczynić moją aplikację przyszłą, ale ci faceci sprawili, że poszedłem we właściwym kierunku. W rzeczywistości nie sprawdzam samego numeru, aby sprawdzić, czy działa, czy nie, po prostu staram się upewnić, że wprowadzono serię liczb, które mogą mieć rozszerzenie lub nie.
Najgorszy scenariusz, jeśli użytkownik musiałby wyciągnąć niesformatowaną liczbę z pliku XML, nadal wpisywałby te liczby na klawiaturze numerycznej telefonu
012345678x5
, bez żadnego prawdziwego powodu, aby był ładny. Ten rodzaj RegEx wyszedłby dla mnie w ten sposób:01234467 extension 123456
01234567x123456
01234567890
źródło
Moją skłonnością jest zgodzić się na to, że usunięcie cyfr i po prostu zaakceptowanie tego, co jest najlepsze. Być może, aby zapewnić obecność co najmniej kilku cyfr, chociaż to zabrania na przykład alfabetycznego numeru telefonu „ASK-JAKE”.
Kilka prostych wyrażeń perla może być:
Użyj pierwszego, aby utrzymać grupy cyfr razem, co może dać wskazówki dotyczące formatowania. Użyj drugiego, aby w trywialny sposób podrzucić wszystkie cyfry.
Czy martwi Cię to, że może zaistnieć potrzeba pauzy, a potem więcej kluczy? Lub coś w rodzaju 555-1212 (poczekaj na sygnał dźwiękowy) 123?
źródło
Musi kończyć się cyfrą, może zaczynać od (lub + lub cyfry i może zawierać + - (lub)
źródło
Dla każdego, kto chce zrobić coś podobnego z irlandzkimi numerami telefonów komórkowych, oto prosty sposób na osiągnięcie tego:
http://ilovenicii.com/?p=87
PHP
Istnieje również rozwiązanie JQuery na tym łączu.
EDYTOWAĆ:
Rozwiązanie jQuery:
Źródło .
źródło