Jak sprawdzać poprawność numerów telefonów za pomocą wyrażenia regularnego


920

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.


3
BTW, powinieneś określić, jakiego języka używasz. Nie wszystkie silniki wyrażeń regularnych mają tę samą składnię.
AndrewJFord,

9
Wygląda na to, że pominąłeś opcję +1 zamiast tylko 1, chociaż odpowiedź obejmuje tę sprawę.
Eric

153
Czy 555oprócz wszystkich amerykańskich numerów telefonów nie są w nich wymagane 911?
Andrew Grimm,

41
Przeciwnie, prefiks 555 jest zarezerwowany dla fałszywych numerów telefonów. Numery te są gwarantowane, że nie łączą się z rzeczywistym numerem telefonu, więc często są używane w telewizji i filmach, aby upewnić się, że widz nie spróbuje zadzwonić pod ten numer i skończy się nękaniem niektórych biednych niewinnych.
rushinge

49
@rushinge Chociaż było to prawdą kilkadziesiąt lat temu, nie jest już prawdą . Prefiks 555 jest nadal wyjątkowy, ale gwarantuje, że tylko niewielki zakres numerów zostanie zakończony bez połączenia 555-0100 z 555-0199. Ale jestem pewien, że Andrew i tak żartował.
Adam Davis

Odpowiedzi:


515

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:

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

Następnie, kiedy wyświetlisz, sformatuj do swoich serc. na przykład

  1 (234) 567-8901
  1 (234) 567-8901 x1234

35
Kod formatowania będzie stratą czasu, jeśli liczby będą mogły pochodzić spoza USA.
Daniel Earwicker

26
To jest dobre i wszystko, ale nie sprawdza poprawności wpisanego numeru telefonu. Na przykład, co jeśli użytkownik nie wprowadzi wymaganych 10 cyfr? Powinno to być połączone z dobrą weryfikacją wyrażeń regularnych.
Hugh Jeffner

108
Biorąc pod uwagę, że pytanie dotyczyło walidacji - to naprawdę bardzo zła odpowiedź.
PlexQ

15
@PlexQ Nie zgadzam się. Pierwotnym problemem jest próba obsłużenia sprawdzania poprawności numeru telefonu, ponieważ próbowano obsłużyć wszystkie możliwe opcje formatowania. Zamiast próbować to wszystko rozwiązać, weź dane wejściowe i „usuń” je z puchu formatującego, aż pojawi się tylko „liczba”. W ten sposób rozwiązano 2 problemy - testowanie wyniku jest teraz łatwe i możesz teraz upewnić się, że wartości renderowane z powrotem do wyświetlania mogą być konsekwentnie formatowane. Pierwszy komentarz do tej odpowiedzi na temat „Rękawic komplikatora” to dobra lektura ... czasami odpowiedzią na problem jest podejście do niego inaczej.
scunliffe

29
Jak, u diabła, ta tak wysoko głosowana odpowiedź? To niczego nie potwierdza . Co gorsza, wszystkie pozostałe pytania dotyczące weryfikacji numeru telefonu odnoszą się do tego ...
jlars62,

303

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:

^(?:(?:\+?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+))?$

7
tutaj jest bez sekcji rozszerzenia (zmuszam moich użytkowników do wpisywania ext w osobnym polu): ^ (?: (?: \ +? 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}) $
aarona

18
Oto wersja, która pasuje tylko do 10-cyfrowych numerów telefonów (a nie 7-cyfrowych jak 843-1212): /(?:(?:\+?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})/
Brian Armstrong,

8
10 cyfr akceptuje () wokół numeru kierunkowego i nie pozwala poprzedzać 1 kodem kraju(?:(?:(\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})
Brooke.

5
@StevenSoroka Przez ostatnie dwa lata trzymałem przy biurku książkę Jeffreya Friedla, ponieważ wyrażenia regularne są główną częścią mojej pracy. Naprawdę zrozumienie wyrażeń regularnych zajmuje dużo czasu. Czasami czytelnicy tej witryny po prostu szukają istniejącego rozwiązania, a nie piszą własne, zwłaszcza w domenach z wieloma przypadkami narożnymi, takimi jak reprezentacje numerów telefonów.
Justin R.

7
@ fatcat1111 Rozumiem to, ale większość odpowiedzi tutaj to jednorazowe wyrażenia regularne typu „ja też”, które prawdopodobnie nie pasują do żadnego z twoich narożnych przypadków. Te następnie trafiają na wszystkie strony internetowe, z których próbuję korzystać i nie mogę wprowadzić kodu pocztowego, numeru telefonu ani adresu e-mail, ponieważ ktoś użył niedopieczonego wyrażenia regularnego (np .: + jest poprawnym znakiem w adresach e-mail ). Najlepsze odpowiedzi na tej stronie wskazują użytkowników na biblioteki, a nie na wyrażenia regularne z serwetkami.
Steven Soroka,

298
.*

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ż:

"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"

202
Zgadzam się z tym sentymentem, ale czasami miło jest przeprowadzić walidację, gdy numer telefonu rzeczywiście zostanie wykorzystany do czegoś ważnego w interesie użytkownika . Najlepszym przykładem jest tutaj autoryzacja karty kredytowej na zakup. Jeśli numer telefonu jest nieprawidłowy, autoryzacja może się nie powieść.
Pointy,

53
Jeśli użytkownik nie chce wprowadzić swojego numeru telefonu, możesz po prostu pozwolić, aby pole było opcjonalne, ale czy to zbyt wiele, aby poprosić użytkownika o podanie prawidłowego numeru telefonu, jeśli zamierza wprowadzić jeden?
Joel McBeth,

11
Rolą sprawdzania poprawności jest również przypominanie ludziom o dodawaniu numerów kierunkowych itp., Że w przeciwnym razie nie pamiętają o dodaniu, ale których nie można odgadnąć po fakcie.
Ben McIntyre

29
@Pointy Ale sprawdzanie poprawności wyrażenia regularnego ci nie pomoże. Jedynym i jedynym sposobem na sprawdzenie, czy numer telefonu jest prawidłowy, jest wysłanie do niego wiadomości (w przypadku telefonu komórkowego) ORAZ upewnienie się, że użytkownik potwierdzi użycie jakiegoś kodu weryfikacyjnego. To właśnie robisz, gdy ważna jest poprawność liczb. Cała reszta służy wyłącznie wygodzie użytkownika w celu ochrony przed niektórymi (ale nie wszystkimi) literówkami i niczego nie sprawdza.
Alex B

14
Fajne. Mój numer telefonu to 1 'LUB 1 = 1 - PWNED . Zobacz xkcd.com/327 i owasp.org/index.php/Testing_for_SQL_Injection_(OWASP-DV-005)
Aaron Newton

171

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–2042jest prawidłowym numerem w USA
    • (999) 974–2042jest nie poprawny numer US
  • Australia
    • 0404 999 999jest prawidłowym numerem australijskim
    • (02) 9999 9999jest również prawidłowym numerem australijskim
    • (09) 9999 9999jest 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 x1234otrzymujesz 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, libphonenumberma 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.


Stwierdzając, że istnieje teraz także portu Go w: github.com/ttacon/libphonenumber
michaelhanson

Podczas sprawdzania, czy jest to możliwy numer, nie musisz podawać kodu kraju? Korzystam z wersji PHP i jeśli wprowadzę liczbę brytyjską, np. (Zamień 0 na liczby rzeczywiste), pojawia 07700000000się Missing or invalid default region.błąd. Ale jeśli podam kod kraju, przejdzie.
BugHunterUK

FYI: Ta biblioteka nie obsługuje niektórych krajów, phpinterviewquestions.co.in/blog/ionic/…
sijo vijayan

1
@BugHunterUK (i każdy, kto natrafi na to pytanie i zastanawia się nad tym samym) podczas analizowania liczby, możesz określić oczekiwany region, a biblioteka będzie szukała numerów innych niż międzynarodowe w tym regionie. Jeśli nie określisz, odrzuci wszystko, co nie jest w ważnym formacie międzynarodowym.
IMSoP

Zastanów się nad github.com/nyaruka/phonenumbers, ponieważ stał się on „oficjalnym” pakietem Go zalecanym przez Google, a nie libphonenumber.
DeeZone

78

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

To 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 oszczędza:

  1. Wskaźnik kraju
  2. Numer telefonu
  3. Rozbudowa

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


To był najbardziej kompleksowy regex, jaki widziałem. Łatwo jest się poruszać, dopóki go nie usuniesz, ^a $ja będę w stanie obejść to za pomocą [111] [111] [1111]lub 111--111--1111podobnego. (przepraszam,
usunąłem

Czy możesz powtórzyć? Nie rozumiem tego: „Łatwo jest znaleźć się dookoła, dopóki nie usuniesz ^ i $, albo będę w stanie obejść to za pomocą [111] [111] [1111]”. Czy to znaczy, że zatwierdza „[111] [111] [1111]”, kiedy bierzesz ^i $?
Ismael Miguel

Mam wokół regex użyciu [111] [111] [1111]i 111--111--1111aż usunąłem ^i $od regex.
bafromca

11
^^^ To świetny przykład, dlaczego wątki komentujące NIE powinny iść na czat. Jestem bardzo zainteresowany tym, jak przebiegła ta rozmowa i muszę wiedzieć, czy ten ReGex jest wystarczająco solidny, aby można go było używać w mojej aplikacji. Niestety, rozmowa na czacie już nie istnieje.
Matt Cashatt

1
Szczerze mówiąc, nie poszedłem na czat. Po wielokrotnym pytaniu o wyjaśnienia nie otrzymałem żadnych informacji. Zawsze możesz wypróbować to sam, korzystając z wszelkiego rodzaju numerów dostępnych online, w wielu formatach. Jedną rzeczą, którą próbowałem z tym, jest użycie wielu numerów telefonów, ale to nie działa tak dobrze, jeśli mają wokół siebie spacje. I muszę znaleźć rozwiązanie, aby policzyć liczbę cyfr i wyegzekwować określoną liczbę.
Ismael Miguel

63

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:

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, 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.

#!/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";
        }
}

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.

'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*))?';

2
FYI regex również pasuje: (4570457-6789co byłoby dość powszechną literówką. Grupy meczów również są wypaczone: rubular.com/r/TaTP0mHL5c
SooDesuNe

@SooDesuNe Prepending (^|[^\d\n])(z włączoną flagą wielowierszową) pozwala uniknąć ogólnego problemu, zapewniając, że nie zostanie natychmiast poprzedzony czymś liczbowym.
btown

Zauważ, że jest to zorientowane na Amerykę Północną - brakuje „44 7911 123456”
Ben Wheeler

43

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

  • Rozpocznij wyrażenie: /^
  • Jeśli chcesz wymagać miejsca, użyj: [\s]lub\s
  • Jeśli chcesz wymagać nawiasu, użyj: [(]i [)]. Używanie \(i \)jest brzydkie i może powodować zamieszanie.
  • Jeśli chcesz, aby cokolwiek było opcjonalne, umieść ?po nim
  • Jeśli chcesz wstawić łącznik, wpisz -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: \-
  • Jeśli chcesz zaakceptować różne opcje w gnieździe, umieść nawiasy wokół opcji: [-.\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ąć.
  • Jeśli chcesz, aby określone liczby pasowały do ​​gniazda, wprowadź je: [246]będzie wymagać 2, 4 lub 6. [77|78]będzie wymagać 77 lub 78.
  • $/ : Zakończenie wyrażenia

1
Jest to bardzo przydatne, ale wątpię i szukam wyrażenia {min, max}. Możesz pomóc?
Ataboy Josef,

Jeśli mówimy o jednej cyfrze (i możesz dopasować ją zgodnie z tym), zobacz [2-9]blok, który tam umieściłem. Oznacza to, że twoja min wynosi 2, a maksymalna to 9. Dostosuj odpowiednio.
vapcguy

30

Pisałem najprościej (chociaż nie potrzebowałem w nim kropki).

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

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


38
to potwierdza ton liczb, które są technicznie nieprawidłowe. jak „- + () () ()) ()))”. Naucz się czytać wyrażenia regularne, aby zrozumieć, co robisz.
Steven Soroka

3
@StevenSoroka technicznie może zezwolić dużo nieważnych sprawach, ale kiedy myślę o tym, pomagając użytkownikowi na zewnątrz, aby uniknąć typowych błędów z najprostszym możliwym rozwiązaniem, to jest do zrobienia :)
happyhardik

2
to również pasuje do białej spacji, pustej linii
Wasim A.

1
@HappyHardik. W rzeczy samej. Prosty i wydajny, do podstawowej weryfikacji pozwala użytkownikowi wpisać więcej niż jedną kropkę, myślnik, nawias lub plus.
dijipiji

Po prostu go użyłem i jest pod wieloma względami błędny. Na przykład numer telefonu w Wielkiej Brytanii może zaczynać się od +44 lub numer telefonu może zawierać (0). Ale to nie jest ważne zgodnie z twoim wyrażeniem regularnym. Poleciłbym odpowiedź @ Ismaela Miguela. Działa dobrze i polecam zrewidować swoją odpowiedź.
Stelios Voskos

22

Jeśli chcesz tylko sprawdzić, czy nie masz przypadkowych śmieci w polu (tj. Od spamerów formularzy), to wyrażenie regularne powinno zrobić dobrze:

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

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, tsą 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.


22

Pamiętaj, że usuwanie ()znaków nie działa w przypadku powszechnego stylu pisania liczb brytyjskich: +44 (0) 1234 567890co oznacza wybranie numeru międzynarodowego:
+441234567890
lub wybrania brytyjskiego01234567890



12

Moja próba nieograniczonego wyrażenia regularnego:

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

Akceptuje:

+(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

Twoim zadaniem jest oczyszczenie go w celu wyświetlenia. Po sprawdzeniu poprawności może to być liczba.


12

Uważam, że 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 ORAZ multilinii, aby się upewnić.

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


11

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:

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

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.


Próbowałem zaimplementować powyższe w moim skrypcie sprawdzania poprawności javascript, ale wciąż pojawia się invalid quantifierbłąd. Jakieś pomysły na to, co robię źle?
Jannis

Dodałbym trywialny przypadek, w którym telefon jest określony bez symboli, ale może spacje i kod kraju, w Europie jest typowy dla numerów lokalnych i komórkowych: 676412342, 676 46 32 12, 676 463 212
rupps

11

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


To ma pewne ograniczone wsparcie dla rozszerzeń. Pasuje do „616-555-1234 x567”, ale nie do „616-555-1234 wew. 567”.
Jon Schneider

2
Fałszywie dodatni dla np. „------- (((((((55555555)” lub „99999999999999999999999”
mikep

To nie sprawdza Nitherland MACDONALDS numer +31 76 596 4192 (właśnie testuje dla liczb losowych)
Biohazard

10

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.


Po wypróbowaniu wielu z nich i przejrzeniu istniejących danych i informacji zwrotnych od użytkowników chciałbym się zgodzić ...
Christopher King,

Czasami jednak trzeba przeprowadzić walidację. Jeśli wysyłam kody potwierdzające, nie mogę po prostu wysłać kodu do dowolnego losowego śmieci, które spamer wprowadził w tym polu. Chcę się upewnić, że numer jest prawdopodobnie numerem telefonu, zanim zmarnuję zasoby na wysyłanie wiadomości.
Luke

10

Jest to prosty wzór wyrażeń regularnych 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}

dopasuje te:

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

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


Dzięki. Co powiesz na numery stacjonarne z numerem kierunkowym, takim jak 028231234? Zastanawiam się, czy numery kierunkowe to tylko 2-3 cyfry i czy zawsze są poprzedzone 0?
stormwild

9

Oto moja najlepsza jak dotąd próba. 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}))?$

9

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


Nie jest to oferowane rozwiązanie. TO JEST MOŻLIWE. To, że jest trudne lub złożone, nie oznacza, że ​​powinieneś po prostu podnieść ręce.
Eric Hodonsky

7

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):

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;
}

To wyrażenie regularne pasowało +1 1234562222222222222222222222.
Varda Elentári

dlaczego po prostu nie wrócić?
thexande

Fałszywie pozytywne dla „999999999999999999999999999999999999999”
Ben Wheeler

6

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.


Mam zamiar wyjść tutaj na całość i powiedzieć, że dopuszczenie 911 jako numeru telefonu jest prawdopodobnie złym pomysłem w prawie wszystkich zastosowaniach tego wyrażenia regularnego. Ale dobry chwyt.
Nicholas Flynt,

4

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.


Uprawomocnienie? 123% $) *% () $ * () # 456 * () * $ # (* (# $ @ 8908 pasowałoby do proponowanego rozwiązania.
PlexQ

1
@PlexQ 555-123-1234, 07777777777, 90210, 01/01/1901 - użytkownicy są pomysłowi w taranowaniu śmieci poprzez sprawdzanie poprawności. Lepiej nie odrzucić tych, którzy naprawdę mają dziwne dane, stosując zbyt restrykcyjne sprawdzanie poprawności i informując ich, że się mylą.
ReactiveRaven

4

Wykonaj zamianę formatowania znaków, a następnie sprawdź pozostałe pod kątem 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 tak złożonego wyrażenia regularnego może być równie skuteczne, ale o wiele prostsze.


3

Uważam to za coś interesującego. Nie testowałem tego, ale wygląda na to, że zadziałałoby

<?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.';
}
?>

4
Twoja wiadomość wydaje się wskazywać, że nie napisałeś tego kodu. Czy mógłbyś podać źródło?
Alastair Irvine


3

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.


3

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.

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

3

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:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

2

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ć:

@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 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?


2
    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

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


2

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


<?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 łączu.

EDYTOWAĆ:

Rozwiązanie jQuery:

    $(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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.