Kompleksowe Wyrażenie regularne do weryfikacji numeru telefonu

Próbuję ułożyć obszerny regex do weryfikacji numerów telefonów. Najlepiej byłoby, gdyby 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 swoją obecną próbą, ale mam nadzieję, że ktoś ma coś lepszego i / lub więcej elegancko.

Author: Nicholas Trandem, 2008-09-24

30 answers

Lepsza opcja... po prostu usuń wszystkie niecyfrowe znaki 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 międzynarodowego prefiksu (w tym konkretnym przypadku należy całkowicie odrzucić (0)).

Następnie, kończysz z wartościami takimi jak:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

Następnie, gdy wyświetlasz, sformatuj do zawartości serca. np.

  1 (234) 567-8901
  1 (234) 567-8901 x1234
 487
Author: scunliffe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 10:47:57

Okazuje się, że jest na to jakiś spec, przynajmniej dla Ameryki Północnej, zwany NANP.

Musisz dokładnie określić, co chcesz. Co to są ograniczniki prawne? Spacje, kreski i kropki? Ogranicznik nie jest dozwolony? Czy można mieszać ograniczniki (np. +0.111-222.3333)? Jak będą obsługiwane rozszerzenia (np. 111-222-3333 x 44444)? A co ze specjalnymi numerami, jak 911? Czy numer kierunkowy będzie opcjonalny czy wymagany?

Oto regex dla 7 lub 10 liczba cyfr, z dozwolonymi rozszerzeniami, ogranicznikami są spacje, myślniki lub kropki:

^(?:(?:\+?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*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$
 281
Author: fatcat1111,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-01 22:06:55
.*

Jeśli użytkownik chce dać ci swój numer telefonu, zaufaj mu, że go poprawi. Jeśli nie chce ci go dać, zmuszając go do wprowadzenia poprawnego numeru, wyśle go do strony konkurenta lub sprawi, że wprowadzi losowy ciąg, który pasuje do twojego wyrażenia regularnego. Mogę nawet pokusić się o wyszukanie numeru linii erotycznej premium rate i wprowadzenie jej zamiast tego.

Uznałbym również którekolwiek z poniższych wpisów za prawidłowe wpisy na stronie internetowej:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"
 278
Author: Dave Kirby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 19:37:33

Sugerowałbym również zajrzenie do biblioteki Google" libphonenumber ". Wiem, że to nie jest regex, ale robi dokładnie to, co chcesz.

Na przykład rozpoznaje, że:

15555555555

Jest liczbą możliwą, ale nie poprawną. Wspiera również kraje spoza USA.

Najważniejsze cechy funkcjonalności:

  • parsowanie / formatowanie / Walidacja numerów telefonów dla wszystkich krajów / regionów świata.
  • getNumberType - dostaje Rodzaj Numeru na podstawie samego numeru; możliwość rozróżnienia numerów stacjonarnych, komórkowych, bezpłatnych, Premium Rate, współdzielonych, VoIP i osobistych (o ile to możliwe).
  • isNumberMatch - pobiera poziom pewności, czy dwie liczby mogą być takie same.
  • getExampleNumber/getExampleNumberByType - zapewnia prawidłowe przykładowe numery 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żliwa phonenumber używając tylko informacji o długości, znacznie szybciej niż pełna Walidacja.
  • isValidNumber - pełna Walidacja 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 w tekście wejściowym.
  • PhoneNumberOfflineGeocoder - podaje informacje geograficzne związane z numerem telefonu.

Przykłady

Największy problem z numerem telefonu Walidacja jest bardzo zależna kulturowo.

  • Ameryka
    • (408) 974–2042 jest poprawny numer US
    • (999) 974–2042 is not a valid US number
  • Australia
    • 0404 999 999 jest poprawna Liczba Australijska
    • (02) 9999 9999 jest również poprawna Liczba Australijska
    • (09) 9999 9999 is not a valid Australian number

Wyrażenie regularne jest w porządku do sprawdzania formatu numeru telefonu, ale tak naprawdę nie będzie w stanie sprawdzić ważności numeru telefonu.

Sugerowałbym pominięcie prostego wyrażenia regularnego, aby przetestować swój numer telefonu, i użycie biblioteki takiej jak Google libphonenumber (link do projektu GitHub) .

Przedstawiamy libphonenumber!

Używając jednego z bardziej złożonych przykładów, 1-234-567-8901 x1234, otrzymujesz następujące dane z libphonenumber (link do online demo):

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

Więc nie tylko dowiadujesz się, czy numer telefonu jest prawidłowy (który jest), ale także uzyskujesz spójne formatowanie numeru telefonu w ustawieniach regionalnych.

Jako bonus, libphonenumber ma wiele zestawów danych, aby sprawdzić ważność numerów telefonów, a także, więc Sprawdzanie numeru, takiego jak +61299999999 (międzynarodowa wersja (02) 9999 9999) zwraca poprawną liczbę 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 chwytanie w 2007 roku, po raz pierwszy w historii, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce, w Polsce i za granicą.]}

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 dla Javy i Javascript, ale ludzie również zaimplementowali biblioteki dla innych języków, które używają zestawu danych numeru telefonu Google i18n:

O ile nie jesteś pewien, że zawsze będziesz przyjmował numery z jednego regionu i zawsze będą one w jednym formacie, sugerowałbym, aby nie pisać własnego kodu do tego celu i używać libphonenumber do sprawdzania i wyświetlania numerów telefonów.

 137
Author: timgws,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-08 15:38:30

/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i

Pasuje:

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973

Na $n zapisuje:

  1. wskaźnik kraju
  2. Numer Telefonu
  3. rozszerzenie

Możesz przetestować na https://www.regexpal.com/?fam=99127

 68
Author: Ismael Miguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 10:05:59

Chociaż odpowiedź na usunięcie wszystkich białych znaków jest zgrabna, tak naprawdę nie rozwiązuje problemu, który został postawiony, czyli znalezienia 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 regex, równie dobrze możesz mieć regex wykonujący całą pracę. Wymyśliłem to:

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

Oto skrypt Perla, który go przetestuje. Gdy dopasujesz, $1 zawiera numer kierunkowy, $2 i $3 zawierają Numer telefonu, a $5 zawiera przedłużenie. Mój skrypt testowy pobiera plik z Internetu i drukuje w nim wszystkie numery telefonów.

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"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",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

Edit:

Możesz zmienić \w * na \ s * \W?\s * w regex, aby go trochę dokręcić. Nie myślałem o regex w kategoriach, powiedzmy, walidacji danych wejściowych użytkownika w formularzu, kiedy go pisałem, ale ta zmiana umożliwia użycie regex w tym celu.
'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';
 62
Author: indiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 22:24:04

Odpowiedziałem na to pytanie na innym więc pytanie przed podjęciem decyzji, aby również dołączyć moją odpowiedź jako odpowiedź na ten wątek, ponieważ nikt nie zajmował się jak wymagać / Nie wymagać elementów, po prostu rozdając regexs: Regex działa źle, dopasowuje nieoczekiwane rzeczy

Z mojego postu na tej stronie, stworzyłem krótki przewodnik, aby pomóc każdemu w tworzeniu własnych wyrażeń regularnych dla własnego pożądanego formatu numeru telefonu, który zastrzeżę (tak jak zrobiłem na innej stronie), że jeśli jesteś zbyt restrykcyjne, może nie uzyskać pożądanych rezultatów, i nie ma "jeden rozmiar dla wszystkich" rozwiązanie do przyjmowania wszystkich możliwych numerów telefonów na świecie - tylko to, co zdecydujesz się zaakceptować jako swój format wyboru. Używaj na własne ryzyko.

Szybki ściągacz

  • Uruchom wyrażenie: /^
  • jeśli chcesz wymagać spacji, użyj: [\s] lub \s
  • jeśli chcesz wymagać nawiasu, użyj: [(] i [)]. Używanie \( i \) jest brzydkie i może rzeczy mylące.
  • jeśli chcesz, aby cokolwiek było opcjonalne, umieść ? po nim
  • jeśli chcesz myślnik, po prostu wpisz - lub [-]. Jeśli jednak nie umieścisz go jako pierwszego lub ostatniego w serii innych postaci, być może będziesz musiał od niego uciec: \-
  • jeśli chcesz zaakceptować różne opcje w gnieździe, umieść nawiasy wokół opcji: [-.\s] będzie wymagać myślnika, kropki lub spacji. Znak zapytania po ostatnim nawiasie sprawi, że wszystkie te elementy będą opcjonalne dla tego miejsca.
  • \d{3} : wymaga 3-cyfrowego numeru: 000-999. Skrót dla [0-9][0-9][0-9].
  • [2-9] : wymaga cyfry 2-9 dla tego gniazda.
  • W przeciwieństwie do innych języków, nie jest to język angielski. Znak "plus" musi być uniknięty.
  • jeśli chcesz, aby określone liczby pasowały do slotu, wprowadź je: [246] będzie wymagać 2, 4 lub 6. [77|78] będzie wymagał 77 lub 78.
  • $/ : koniec wyrażenia
 39
Author: vapcguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:32

Napisałem najprościej (choć nie potrzebowałem w nim kropki).

^([0-9\(\)\/\+ \-]*)$

Jak wspomniano poniżej, sprawdza tylko znaki, a nie jego strukturę/kolejność

 27
Author: Artjom Kurapov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 22:53:45

Zauważ, że usuwanie znaków () nie działa dla stylu zapisu liczb brytyjskich, który jest powszechny: +44 (0) 1234 567890 co oznacza wybieranie numeru międzynarodowego:
+441234567890
lub w Wielkiej Brytanii wybierz 01234567890

 22
Author: Ben Clifford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-03 04:38:07

Jeśli chcesz tylko zweryfikować, że nie masz losowych śmieci w polu (np. od spamerów formularzy), regex powinien działać ładnie:

^[0-9+\(\)#\.\s\/ext-]+$

Zauważ, że nie ma żadnych specjalnych zasad dotyczących liczby cyfr lub liczby, które są ważne 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ć kompatybilny z numerami międzynarodowymi i formatami lokalizacji. Czy przewidujesz potrzebę zezwalania na nawiasy kwadratowe, kręcone lub kątowe dla niektórych regionów? (obecnie nie są uwzględniane).

Jeśli chcesz zachować zasady dotyczące cyfr (takie jak kody obszarów w USA i prefiksy (kody wymiany) muszą mieścić się w zakresie 200-999), powodzenia. Utrzymanie złożonego zestawu reguł, który może być przestarzały w dowolnym momencie w przyszłości przez dowolny kraj na świecie, nie brzmi zabawnie.

I podczas usuwania wszystkich / większości znaków nieliczbowych może działać dobrze na po stronie serwera (zwłaszcza jeśli planujesz przekazać te wartości do dialera), możesz nie chcieć tracić danych wejściowych użytkownika podczas walidacji, szczególnie jeśli chcesz, aby wprowadził poprawki w innym polu.

 18
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 19:33:53

Czy przyjrzałeś się RegExLib ?

Podanie nam numeru telefonu przyniosło spore możliwości.

 14
Author: Rob Wells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 20:19:52

Uznałem, że to działa całkiem dobrze:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

Działa dla tych formatów liczb:

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
1-234-567-8901 ext. 1234
(+351) 282 433 5050

Upewnij się, że używasz FLAG globalnych i wielowierszowych, aby się upewnić.

Link: http://www.regexr.com/3bp4b

 12
Author: Herobrine2Nether,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 22:02:49

Jeśli mówisz o walidacji formularza, Wyrażenie regularne do walidacji poprawnego znaczenia oraz poprawnych danych będzie niezwykle złożone ze względu na różne standardy krajowe i dostawców. Będzie również trudno być na bieżąco.

Interpretuję to pytanie jako szukanie ogólnie poprawnego wzoru, który może nie być wewnętrznie spójny - na przykład posiadanie poprawnego zbioru liczb, ale nie potwierdzanie, że linia tułowia, wymiana itp. do prawidłowego wzoru kodu kraju prefiks.

Ameryka Północna jest prosta, a dla międzynarodowych wolę używać 'idiomatycznego' wzoru, który obejmuje sposób, w jaki ludzie określają i zapamiętują swoje liczby:]}
^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

Północnoamerykański wzór zapewnia, że jeśli jeden nawias jest uwzględniony, oba są. Międzynarodowy rachunek zawiera opcjonalny początkowy " + " i kod kraju. Po tym, jesteś w idiomie. Poprawne mecze be:

  • (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
To może być stronnicze, ponieważ moje doświadczenie jest ograniczone do Ameryki Północnej, Europy i małej części Azji.
 11
Author: ron0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 19:36:58

Moja próba nieograniczonego wyrażenia regularnego:

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/

Przyjmuje:

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww

Odrzuca:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911
To do ciebie należy dezynfekcja do wyświetlania. Po walidacji Może być liczbą.
 11
Author: ReactiveRaven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 15:29:43

Jest to prosty wzór wyrażenia regularnego dla filipińskich numerów telefonów komórkowych:

((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

Lub

((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}

Pasuje do tych:

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  

Pierwszy będzie pasował do dowolnego dwucyfrowego kodu kraju, podczas gdy drugi będzie pasował wyłącznie do filipińskiego kodu kraju.

Przetestuj go tutaj: http://refiddle.com/1ox

 10
Author: GaiusSensei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 19:35:59

Moje przeczucie wzmacnia Ilość odpowiedzi na ten temat - że istnieje praktycznie nieskończona liczba rozwiązań tego problemu, z których żadne nie będzie eleganckie.

Szczerze polecam nie próbować sprawdzać numerów telefonów. Nawet gdybyś mógł napisać Duży, owłosiony walidator, który pozwoliłby na wszystkie różne legalne formaty, w końcu pozwoliłby na praktycznie wszystko, nawet zdalnie przypominające numer telefonu.

In my opinia, najbardziej eleganckim rozwiązaniem jest sprawdzenie minimalnej długości, nic więcej.

 9
Author: mindplay.dk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-14 20:56:45

Będziesz miał trudności z radzeniem sobie z numerami międzynarodowymi z pojedynczym / prostym regexem, zobacz Ten post o trudnościach międzynarodowych (a nawet północnoamerykańskich) numerów telefonicznych.

Będziesz chciał przeanalizować kilka pierwszych cyfr, aby określić kod kraju, a następnie postępować inaczej w zależności od kraju.

Poza tym - lista, którą podałeś, nie zawiera innego popularnego formatu amerykańskiego-pomijając początkowe 1. Większość telefonów komórkowych w USA tego nie wymaga, a to zacznie dziwić młodemu pokoleniu, chyba że wykręcą numer na arenie międzynarodowej.

Prawidłowo zidentyfikowałeś, że to trudny problem...

- Adam

 8
Author: Adam Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:36

Po przeczytaniu tych odpowiedzi, wygląda na to, że nie było prostego wyrażenia regularnego, które może analizować kilka tekstów i wyciągać numery telefonów w dowolnym formacie (w tym Międzynarodowy ze znakiem plusa i bez niego).

Oto, czego użyłem ostatnio w projekcie klienta, gdzie musieliśmy przekonwertować wszystkie numery telefonów w dowolnym formacie na tel: linki.

Jak na razie działa ze wszystkim, co na niego rzucili, ale jeśli pojawią się błędy, zaktualizuję to odpowiedz.

Regex:

/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/

Funkcja PHP zamieniająca wszystkie numery telefonów na tel: links (w razie gdyby ktoś był ciekawy):

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}
 8
Author: Drew Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-08 18:28:53

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 szeroko użytecznej odpowiedzi.

Następujące wyrażenia regularne wychwytują powszechnie używane kombinacje liczb i znaków w różnych globalnych formatach numerów telefonicznych:

/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm

Pozytywny:
+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
1 416 555 9292

Negatywne:
926 3 4
8 800 600-APPLE

Oryginalne źródło: http://www.regexr.com/38pvb

 8
Author: Stuart Kershaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 22:24:05

Oto moja najlepsza próba do tej pory. Obsługuje powyższe formaty, ale jestem pewien, że brakuje mi innych możliwych formatów.

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
 7
Author: Nicholas Trandem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 20:14:20

Wierzę, że Number::Phone::US i Regexp::Common (szczególnie źródło Regexp::Common::URI::RFC2806 ) moduły Perla mogą pomóc.

Pytanie powinno być prawdopodobnie sprecyzowane nieco bardziej szczegółowo, aby wyjaśnić cel walidacji liczb. Na przykład, 911 jest prawidłową liczbą w USA, ale 911x nie jest dla żadnej wartości x. to jest tak, że firma telefoniczna może obliczyć, kiedy skończysz wybieranie numeru. Istnieje kilka odmian tej kwestii. Ale twoje Wyrażenie regularne nie sprawdza części kierunkowej, więc to nie wydaje się być problemem.

Podobnie jak sprawdzanie poprawności adresów e-mail, nawet jeśli masz poprawny wynik, nie możesz wiedzieć, czy jest on przypisany do kogoś, dopóki go nie spróbujesz.

Jeśli próbujesz zweryfikować dane wejściowe użytkownika, dlaczego nie znormalizować wyniku i nie zrobić z nim? Jeśli użytkownik wprowadzi numer, którego nie można rozpoznać jako prawidłowy, zapisz go jako wprowadzony lub usuń znaki niedostępne. Na Number:: Phone:: Normalize Moduł Perla może być źródłem inspiracji.

 6
Author: Jon Ericson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 21:02:04

Pracuję dla firmy zajmującej się badaniami rynku i musimy filtrować tego typu dane przez cały czas. Za bardzo to komplikujesz. Po prostu usuń znaki nie alfanumeryczne i sprawdź, czy jest jakieś rozszerzenie.

Do dalszej analizy możesz zapisać się do jednego z wielu dostawców, który da ci dostęp do bazy ważnych numerów, a także poinformuje cię, czy są to Telefony stacjonarne lub komórkowe, odłączone itp. To kosztuje.

 4
Author: Joe Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 20:41:56

Wykonaj zastąpienie znaków formatowania, a następnie sprawdź pozostałe dla ważności telefonu. W PHP,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

Złamanie złożonego wyrażenia regularnego, takiego jak to, może być równie skuteczne, ale znacznie prostsze.

 4
Author: rooskie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 12:03:56

Uznałem to za coś interesującego. Nie testowałem go, ale wygląda na to, że zadziała

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>
 3
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 13:37:04

Prawdopodobnie lepiej byłoby użyć do tego maskowanego wejścia. W ten sposób użytkownicy mogą wprowadzać tylko liczby i można formatować jak uważasz za stosowne. Nie jestem pewien, czy jest to dla aplikacji internetowej, ale jeśli jest to jest bardzo kliknij wtyczkę jQuery, która oferuje pewne opcje do tego.

Http://digitalbush.com/projects/masked-input-plugin/

W samouczku omawiają nawet sposób maskowania numerów telefonów.

 3
Author: Abe Miessler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-11 05:10:29

Oto jeden, który działa dobrze w JavaScript. Jest w ciąg, ponieważ tego oczekiwał widget Dojo.

Pasuje do 10-cyfrowego numeru NANP w Ameryce Północnej z opcjonalnym rozszerzeniem. Spacje, myślniki i okresy są akceptowane jako ograniczniki.

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"
 3
Author: Richard Ayotte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-13 19:47:55

Zmagałem się z tym samym problemem, starając się, aby moje podanie było przyszłościowe, ale ci goście sprawili, że poszedłem w dobrym kierunku. Nie sprawdzam samego numeru, aby sprawdzić, czy działa, czy nie, po prostu staram się upewnić, że wprowadzono serię numerów, które mogą lub nie mieć rozszerzenia.

Najgorszy scenariusz, gdyby użytkownik musiał wyciągnąć Nieformatowany numer z pliku XML, nadal wpisywałby numery do numberpada telefonu 012345678x5, nie ma prawdziwego powód, by być ładnym. Taki RegEx wyjdzie mi coś takiego:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890
 3
Author: 3 revs, 3 users 43%Keith Wiggans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 19:38:01

Moja skłonność jest do zgodzić się, że rozebrać nie-cyfry i po prostu zaakceptować to, co jest najlepsze. Może po to, aby przynajmniej kilka cyfr było obecnych, chociaż to nie zabrania czegoś takiego jak alfabetyczny numer telefonu "ASK-JAKE" na przykład.

Kilka prostych wyrażeń Perla może być:

@f = /(\d+)/g;
tr/0-9//dc;

Użyj pierwszego, aby utrzymać grupy cyfr razem, co może dać wskazówki dotyczące formatowania. Użyj drugiego, aby trywialnie wrzucić wszystkie niecyfrowe.

Czy jest to zmartwienie, że tam może trzeba być pauzą, a następnie wprowadzić więcej klawiszy? Albo coś w stylu 555-1212 (czekaj na sygnał dźwiękowy) 123?

 2
Author: piCookie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 22:59:20
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

Musi kończyć się cyfrą, może zaczynać się od ( Lub + lub cyfra i może zawierać + - (lub)

 2
Author: Ian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 23:16:18

Dla wszystkich zainteresowanych zrobieniem czegoś podobnego z irlandzkimi numerami telefonów komórkowych, Oto prosty sposób na osiągnięcie tego:

Http://ilovenicii.com/?p=87

PHP


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

Istnieje również rozwiązanie JQuery na tym linku.

EDIT:

JQuery solution:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

Źródło .

 2
Author: Lajos Arpad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 15:38:51