Cara memvalidasi nomor telepon menggunakan regex

920

Saya mencoba menyusun regex komprehensif untuk memvalidasi nomor telepon. Idealnya akan menangani format internasional, tetapi harus menangani format AS, termasuk yang berikut:

  • 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

Saya akan menjawab dengan upaya saya saat ini, tetapi saya berharap seseorang memiliki sesuatu yang lebih baik dan / atau lebih elegan.

Nicholas Trandem
sumber
3
BTW, Anda harus menentukan bahasa apa yang Anda gunakan. Tidak semua mesin regex memiliki sintaks yang sama.
AndrewJFord
9
Sepertinya Anda mengabaikan opsi +1 bukannya hanya 1 walaupun jawabannya mencakup kasus ini.
Eric
153
Tidak semua nomor telepon AS mengharuskan 555mereka terpisah 911?
Andrew Grimm
41
Sebaliknya, awalan 555 dicadangkan untuk nomor telepon palsu. Angka-angka itu dijamin tidak terhubung ke nomor telepon yang sebenarnya sehingga sering digunakan di televisi dan film untuk memastikan bahwa pemirsa tidak mencoba menelepon nomor tersebut dan akhirnya melecehkan beberapa orang miskin yang tidak bersalah.
bergegas
49
@rushinge Sementara itu benar beberapa dekade yang lalu, itu tidak lagi benar . Awalan 555 masih istimewa, tetapi hanya sejumlah kecil angka yang dijamin akan berakhir tanpa koneksi 555-0100 hingga 555-0199. Tapi aku yakin Andrew tetap bercanda.
Adam Davis

Jawaban:

515

Opsi yang lebih baik ... cukup hapus semua karakter non-digit pada input (kecuali tanda 'x' dan memimpin '+'), berhati-hati karena kecenderungan Inggris untuk menulis angka dalam bentuk non-standar +44 (0) ...ketika diminta untuk menggunakan awalan internasional (dalam kasus khusus itu, Anda harus membuang (0)seluruhnya).

Kemudian, Anda berakhir dengan nilai-nilai seperti:

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

Kemudian ketika Anda menampilkan, format ulang ke isi hati Anda. misalnya

  1 (234) 567-8901
  1 (234) 567-8901 x1234
scunliffe
sumber
35
Kode pemformatan akan menjadi buang-buang waktu jika angka-angka tersebut diizinkan berasal dari luar AS.
Daniel Earwicker
26
Ini bagus dan semuanya, tetapi tidak memvalidasi yang dimasukkan sebenarnya adalah nomor telepon. Misalnya, bagaimana jika pengguna tidak memasukkan 10 digit yang diperlukan? Ini harus dikombinasikan dengan validasi regex yang baik.
Hugh Jeffner
108
Menimbang pertanyaannya adalah tentang validasi - ini adalah jawaban yang benar-benar buruk.
PlexQ
15
@PlexQ Saya tidak setuju. Masalah aslinya adalah mencoba menangani validasi nomor telepon karena mencoba menangani semua opsi pemformatan yang mungkin. Daripada mencoba menyelesaikan semua itu, ambillah input dan "pra-strip" dari semua pemformatan bulu sampai Anda memiliki "angka" saja. Melakukan ini menyelesaikan 2 masalah - menguji hasilnya sekarang mudah dan Anda sekarang dapat memastikan bahwa nilai yang ditampilkan kembali untuk tampilan semua dapat diformat secara konsisten. Komentar pertama pada jawaban ini tentang "Sarung Tangan Komplikator" adalah bacaan yang bagus ... kadang-kadang jawaban untuk suatu masalah adalah dengan mendekatinya secara berbeda.
scunliffe
29
Bagaimana ini jawaban yang sangat tinggi? Ini tidak memvalidasi apa pun. Yang lebih buruk adalah semua pertanyaan validasi nomor telepon lainnya merujuk yang ini ...
jlars62
303

Ternyata ada sesuatu yang spesifik untuk ini, setidaknya untuk Amerika Utara, yang disebut NANP .

Anda perlu menentukan dengan tepat apa yang Anda inginkan. Apa itu pembatas hukum? Spasi, tanda hubung, dan titik? Pembatas tidak diizinkan? Bisakah satu pencampur pembatas (misalnya, + 0.111-222.3333)? Bagaimana ekstensi (mis., 111-222-3333 x 44444) akan ditangani? Bagaimana dengan nomor khusus, seperti 911? Apakah kode area akan menjadi opsional atau diperlukan?

Berikut adalah regex untuk angka 7 atau 10 digit, dengan ekstensi diizinkan, pembatas adalah spasi, tanda hubung, atau titik:

^(?:(?:\+?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+))?$
fatcat1111
sumber
7
ini dia tanpa bagian ekstensi (saya membuat pengguna saya memasukkan ext di bidang terpisah): ^ (?: (?: \ +? 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
Berikut adalah versi yang hanya cocok dengan 10 digit nomor telepon (bukan 7 digit seperti 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 digit menerima () di sekitar kode area, dan dosen tidak mengizinkan sebelumnya 1 sebagai kode negara(?:(?:(\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 Saya memiliki buku Jeffrey Friedl di samping saya di meja saya selama dua tahun terakhir, karena ekspresi reguler adalah bagian utama dari pekerjaan saya. Butuh beberapa saat untuk benar-benar memahami ekspresi reguler. Terkadang, pembaca situs ini hanya mencari soluion yang ada, daripada menulis sendiri, terutama di domain dengan banyak kasus sudut, seperti representasi nomor telepon.
Justin R.
7
@ fatcat1111 Saya mengerti itu, tetapi sebagian besar tanggapan di sini adalah jenis "aku juga" satu-off ekspresi reguler yang mungkin tidak cocok dengan semua kasus sudut Anda. Ini kemudian berakhir di semua situs web yang saya coba gunakan dan saya tidak bisa memasukkan kode pos atau nomor telepon atau alamat email saya karena seseorang menggunakan ekspresi reguler setengah-panggang (mis .: + adalah karakter yang valid di alamat email ). Respons terbaik pada halaman ini mengarahkan pengguna ke perpustakaan, bukan ke regex yang ditulis dengan serbet.
Steven Soroka
298
.*

Jika pengguna ingin memberikan nomor teleponnya kepada Anda, percayakan pada mereka untuk memperbaikinya. Jika mereka tidak ingin memberikannya kepada Anda maka memaksa mereka untuk memasukkan nomor yang valid akan mengirim mereka ke situs pesaing atau membuat mereka memasukkan string acak yang sesuai dengan regex Anda. Saya bahkan mungkin tergoda untuk mencari nomor hotline horoskop tingkat premium dan memasukkannya.

Saya juga akan mempertimbangkan salah satu dari yang berikut ini sebagai entri yang valid di situs web:

"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"
Dave Kirby
sumber
202
Saya setuju dengan sentimen di sini, tetapi kadang-kadang senang melakukan validasi ketika nomor telepon benar-benar akan digunakan untuk sesuatu yang penting demi kepentingan pengguna . Contoh terbaik di sini adalah otorisasi kartu kredit untuk pembelian. Jika nomor telepon salah, auth mungkin gagal.
Runcing
53
Jika pengguna tidak ingin memasukkan nomor teleponnya, Anda bisa membiarkan bidangnya opsional, tetapi apakah terlalu banyak meminta pengguna untuk memasukkan nomor telepon yang valid jika mereka mau memasukkannya?
Joel McBeth
11
Juga peran validasi adalah hanya untuk mengingatkan orang untuk menambahkan kode area dll yang mereka mungkin tidak ingat untuk menambahkan, tetapi yang tidak mungkin dapat ditebak setelah fakta.
Ben McIntyre
29
@Pointy Tapi validasi regex tidak akan membantu Anda. Satu-satunya cara untuk benar-benar memvalidasi jika nomor teleponnya benar adalah dengan benar-benar mengirim pesan kepadanya (jika ada ponsel) DAN pastikan pengguna mengonfirmasi menggunakan semacam kode verifikasi. Inilah yang Anda lakukan ketika kebenaran angka itu penting. Segala sesuatu yang lain hanya untuk kenyamanan pengguna untuk melindungi terhadap beberapa kesalahan ketik (tetapi tidak semua) dan tidak memvalidasi apa pun.
Alex B
14
Keren. Nomor telepon saya adalah 1 'ATAU 1 = 1 - PWNED . Lihat xkcd.com/327 dan owasp.org/index.php/Testing_for_SQL_Injection_(OWASP-DV-005)
Aaron Newton
171

Saya juga menyarankan melihat Perpustakaan Google " libphonenumber ". Saya tahu ini bukan regex tetapi ia melakukan apa yang Anda inginkan.

Misalnya, ia akan mengenali bahwa:

15555555555

adalah angka yang mungkin tetapi bukan angka yang valid. Ini juga mendukung negara-negara di luar AS.

Sorotan fungsionalitas:

  • Memilah / memformat / memvalidasi nomor telepon untuk semua negara / wilayah di dunia.
  • getNumberType- mendapatkan jenis nomor berdasarkan nomor itu sendiri; mampu membedakan Fixed-line, Mobile, Bebas Pulsa, Tingkat Premium, Biaya Bersama, VoIP dan Nomor Pribadi (jika memungkinkan).
  • isNumberMatch - mendapat tingkat kepercayaan apakah dua angka bisa sama.
  • getExampleNumber/ getExampleNumberByType- memberikan nomor contoh yang valid untuk semua negara / wilayah, dengan opsi untuk menentukan jenis contoh nomor telepon yang dibutuhkan.
  • isPossibleNumber - Cepat menebak apakah nomor adalah nomor telepon yang mungkin dengan hanya menggunakan informasi panjang, jauh lebih cepat daripada validasi penuh.
  • isValidNumber - validasi penuh nomor telepon untuk wilayah yang menggunakan informasi panjang dan awalan.
  • AsYouTypeFormatter - memformat nomor telepon dengan cepat saat pengguna memasukkan setiap digit.
  • findNumbers - Menemukan angka dalam input teks.
  • PhoneNumberOfflineGeocoder - memberikan informasi geografis yang terkait dengan nomor telepon.

Contohnya

Masalah terbesar dengan validasi nomor telepon adalah sangat tergantung secara budaya.

  • Amerika
    • (408) 974–2042adalah nomor AS yang valid
    • (999) 974–2042adalah tidak valid nomor AS
  • Australia
    • 0404 999 999adalah nomor Australia yang valid
    • (02) 9999 9999juga nomor Australia yang valid
    • (09) 9999 9999adalah tidak valid nomor Australia

Persamaan reguler baik untuk memeriksa format nomor telepon, tetapi itu tidak benar-benar akan dapat memeriksa validitas nomor telepon.

Saya akan menyarankan melewatkan ekspresi reguler sederhana untuk menguji nomor telepon Anda, dan menggunakan perpustakaan seperti Google libphonenumber(tautan ke proyek GitHub) .

Memperkenalkan nomor telepon!

Dengan menggunakan salah satu contoh yang lebih kompleks 1-234-567-8901 x1234,, Anda mendapatkan data berikut dari libphonenumber(tautan ke demo 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

Jadi, Anda tidak hanya belajar jika nomor telepon itu valid (yang mana), tetapi Anda juga mendapatkan pemformatan nomor telepon yang konsisten di tempat Anda.

Sebagai bonus, libphonenumbermemiliki sejumlah dataset untuk memeriksa validitas nomor telepon, jadi, memeriksa nomor seperti +61299999999(versi internasional (02) 9999 9999) akan dikembalikan sebagai nomor yang valid dengan pemformatan:

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 juga memberi Anda banyak manfaat tambahan, seperti mengambil lokasi tempat nomor telepon terdeteksi, dan juga mendapatkan informasi zona waktu dari nomor telepon:

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]

Tetapi nomor telepon Australia yang tidak valid ( (09) 9999 9999) mengembalikan bahwa itu bukan nomor telepon yang valid.

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

Versi Google memiliki kode untuk Java dan Javascript, tetapi orang-orang juga telah mengimplementasikan perpustakaan untuk bahasa lain yang menggunakan dataset nomor telepon Google i18n:

Kecuali Anda yakin bahwa Anda akan selalu menerima angka dari satu lokal, dan mereka selalu akan berada dalam satu format, saya sangat menyarankan untuk tidak menulis kode Anda sendiri untuk ini, dan menggunakan libphonenumber untuk memvalidasi dan menampilkan nomor telepon.

Tim Groeneveld
sumber
Memperhatikan bahwa sekarang juga ada Port di: github.com/ttacon/libphonenumber
michaelhanson
Saat memeriksa apakah itu nomor yang memungkinkan, bukankah Anda harus menentukan kode negara? Saya menggunakan versi PHP dan jika saya memasukkan nomor Inggris seperti (ganti 0 dengan angka asli) 07700000000saya mendapatkan Missing or invalid default region.kesalahan. Tetapi jika saya menentukan kode negara itu akan berlalu.
BugHunterUK
FYI: Perpustakaan ini tidak mendukung beberapa negara, phpinterviewquestions.co.in/blog/ionic/…
sijo vijayan
1
@BugHunterUK (dan siapa saja yang menemukan pertanyaan ini dan bertanya-tanya sama) ketika mengurai nomor, Anda dapat menentukan wilayah yang diharapkan, dan perpustakaan akan mencari nomor non-internasional di wilayah itu. Jika Anda tidak menentukan, itu akan menolak apa pun yang tidak dalam format internasional yang valid.
IMSoP
Pertimbangkan github.com/nyaruka/phonenumber karena telah menjadi paket Go "resmi" yang direkomendasikan oleh Google daripada libphonenumber.
DeeZone
78

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

Ini cocok:

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

Pada $ n, ini menghemat:

  1. Indikator negara
  2. Nomor telepon
  3. Perpanjangan

Anda dapat mengujinya di https://www.regexpal.com/?fam=99127

Ismael Miguel
sumber
Ini adalah regex paling komprehensif yang pernah saya lihat. Sangat mudah untuk berkeliling sampai Anda menghapus ^dan $atau saya bisa menyiasatinya menggunakan [111] [111] [1111]atau 111--111--1111dan sejenisnya. (maaf, hapus komentar terakhir saya)
bafromca
Bisakah Anda ulangi frasa? Saya tidak dapat memahami ini: "Mudah untuk mendapatkan diseluruh sampai Anda menghapus ^ dan $ atau aku bisa mengatasinya menggunakan [111] [111] [1111]". Apakah itu berarti bahwa itu memvalidasi '[111] [111] [1111]' ketika Anda mengambil ^dan $?
Ismael Miguel
Saya menggunakan regex Anda menggunakan [111] [111] [1111]dan 111--111--1111sampai saya dihapus ^dan $dari regex.
bafromca
11
^^^ Ini adalah contoh bagus mengapa utas komentar tidak boleh pergi ke obrolan. Saya sangat tertarik dengan bagaimana percakapan ini terjadi dan perlu tahu apakah ReGex ini cukup kokoh untuk digunakan di aplikasi saya. Sayangnya, obrolan obrolan sekarang hilang.
Matt Cashatt
1
Sejujurnya, saya tidak pergi untuk mengobrol. Setelah bertanya beberapa kali untuk penjelasan, saya dibiarkan tanpa info. Anda selalu dapat mencobanya sendiri dengan semua jenis angka yang Anda temukan online, dalam berbagai format. Satu hal yang saya coba dengan yang satu ini adalah menggunakan beberapa nomor telepon, tetapi tidak berfungsi dengan baik jika ada ruang di sekitarnya. Dan saya harus menemukan solusi untuk menghitung jumlah digit dan menegakkan jumlah tertentu.
Ismael Miguel
63

Meskipun jawaban untuk menghapus semua spasi putih adalah rapi, itu tidak benar-benar menyelesaikan masalah yang diajukan, yaitu menemukan regex. Ambil, misalnya, skrip pengujian saya yang mengunduh halaman web dan mengekstrak semua nomor telepon menggunakan regex. Karena Anda tetap memerlukan regex, Anda mungkin juga meminta regex melakukan semua pekerjaan. Saya datang dengan ini:

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

Berikut skrip perl untuk mengujinya. Ketika Anda cocok, $ 1 berisi kode area, $ 2 dan $ 3 berisi nomor telepon, dan $ 5 berisi ekstensi. Skrip pengujian saya mengunduh file dari internet dan mencetak semua nomor telepon di dalamnya.

#!/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:

Anda dapat mengubah \ W * ke \ s * \ W? \ S * di regex untuk mengencangkannya sedikit. Saya tidak memikirkan regex dalam hal, katakanlah, memvalidasi input pengguna pada formulir ketika saya menulisnya, tetapi perubahan ini memungkinkan untuk menggunakan regex untuk tujuan itu.

'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*))?';
indiv
sumber
2
FYI regex juga cocok: (4570457-6789yang akan menjadi kesalahan ketik yang cukup umum. Grup pertandingan juga akan miring: rubular.com/r/TaTP0mHL5c
SooDesuNe
@SooDesuNe Prepending (^|[^\d\n])(dengan bendera multiline aktif) menghindari masalah umum, dengan memastikan itu tidak segera didahului oleh sesuatu yang numerik.
btown
Perhatikan bahwa ini adalah Amerika Utara-sentris - ia meleset "44 7911 123456"
Ben Wheeler
43

Saya menjawab pertanyaan ini pada pertanyaan SO lain sebelum memutuskan untuk juga memasukkan jawaban saya sebagai jawaban di utas ini, karena tidak ada yang membahas bagaimana cara meminta / tidak memerlukan barang, hanya membagikan regex: Regex salah, mencocokkan hal-hal yang tidak terduga

Dari posting saya di situs itu, saya telah membuat panduan cepat untuk membantu siapa pun dengan membuat regex mereka sendiri untuk format nomor telepon yang mereka inginkan, yang akan saya tegaskan (seperti yang saya lakukan di situs lain) bahwa jika Anda terlalu membatasi, Anda mungkin tidak mendapatkan hasil yang diinginkan, dan tidak ada solusi "satu ukuran cocok untuk semua" untuk menerima semua nomor telepon yang mungkin ada di dunia - hanya apa yang Anda putuskan untuk diterima sebagai format pilihan Anda. Gunakan dengan risiko Anda sendiri.

Lembar cheat cepat

  • Mulai ekspresi: /^
  • Jika Anda ingin memerlukan ruang, gunakan: [\s]atau\s
  • Jika Anda ingin membutuhkan tanda kurung, gunakan: [(]dan [)]. Menggunakan \(dan \)jelek dan dapat membuat hal-hal membingungkan.
  • Jika Anda ingin sesuatu menjadi opsional, letakkan ?setelahnya
  • Jika Anda ingin tanda hubung, cukup ketik -atau [-]. Jika Anda tidak menempatkannya di urutan pertama atau terakhir di serangkaian karakter lain, Anda mungkin perlu menghindarinya: \-
  • Jika Anda ingin menerima pilihan berbeda dalam slot, letakkan tanda kurung di sekeliling opsi: [-.\s]akan membutuhkan tanda hubung, titik, atau ruang. Tanda tanya setelah braket terakhir akan membuat semua itu opsional untuk slot itu.
  • \d{3}: Membutuhkan nomor 3 digit: 000-999. Singkatan untuk [0-9][0-9][0-9].
  • [2-9] : Membutuhkan digit 2-9 untuk slot itu.
  • (\+|1\s)?: Terima "plus" atau 1 dan spasi (karakter pipa |,, adalah "atau"), dan jadikan opsional. Tanda "tambah" harus diloloskan.
  • Jika Anda ingin nomor-nomor tertentu cocok dengan slot, masukkan: [246]akan membutuhkan 2, 4, atau 6. [77|78]akan membutuhkan 77 atau 78.
  • $/ : Akhiri ekspresi
vapcguy
sumber
1
Ini sangat berguna, tetapi saya ragu dan mencari ekspresi {min, max}. Dapatkah kamu menolong?
Ataboy Josef
Jika ini adalah satu digit yang sedang kita bicarakan (dan Anda dapat mencocokkannya dengan itu), lihat [2-9]blok yang saya taruh di sana. Itu berarti min Anda adalah 2, dan maks. Anda adalah 9. Sesuaikan.
vapcguy
30

Saya menulis paling sederhana (walaupun saya tidak perlu dot di dalamnya).

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

Seperti disebutkan di bawah, ini hanya memeriksa karakter, bukan struktur / urutannya

rev Artjom Kurapov
sumber
38
ini memvalidasi ton angka yang secara teknis tidak valid. seperti, "- + () () ()) ())))". Belajar membaca ekspresi reguler sehingga Anda dapat memahami apa yang Anda lakukan.
Steven Soroka
3
@StevenSoroka secara teknis mungkin memungkinkan banyak kasus tidak valid, tetapi ketika kita berpikir tentang hanya membantu pengguna untuk menghindari kesalahan umum dengan solusi yang paling sederhana, ini adalah cara untuk pergi :)
happyhardik
2
ruang putih ini juga cocok, garis kosong
Wasim A.
1
@ HappyHardik. Memang. Sederhana dan kuat, untuk validasi dasar, biarkan pengguna mengetik lebih dari satu titik, tanda hubung, braket, atau plus.
dijipiji
Hanya menggunakannya dan itu salah dalam banyak aspek. Misalnya, nomor telepon UK dapat dimulai dengan +44, atau nomor telepon mungkin memiliki (0) di dalamnya. Tetapi ini tidak valid sesuai dengan ekspresi reguler Anda. Saya akan merekomendasikan jawaban @Ismael Miguel. Ini berfungsi dengan baik dan saya akan merekomendasikan Anda untuk merevisi jawaban Anda.
Stelios Voskos
22

Jika Anda hanya ingin memverifikasi bahwa Anda tidak memiliki sampah acak di lapangan (mis., Dari spammer formulir) regex ini dapat digunakan dengan baik:

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

Perhatikan bahwa tidak memiliki aturan khusus untuk berapa digit, atau angka apa yang valid dalam digit itu, itu hanya memverifikasi bahwa hanya digit, tanda kurung, tanda hubung, plus, spasi, pound, tanda bintang, titik, koma, atau huruf e, x, thadir.

Ini harus kompatibel dengan angka internasional dan format pelokalan. Apakah Anda memperkirakan perlu membiarkan kurung siku, keriting, atau miring untuk beberapa daerah? (saat ini mereka tidak termasuk).

Jika Anda ingin mempertahankan aturan per digit (seperti di Kode Area AS dan Awalan (kode tukar) harus berada dalam kisaran 200-999), semoga berhasil. Mempertahankan aturan-aturan yang rumit yang bisa ketinggalan zaman di mana saja di masa depan oleh negara mana pun di dunia tidak terdengar menyenangkan.

Dan sementara menghapus semua / sebagian besar karakter non-numerik dapat bekerja dengan baik di sisi server (terutama jika Anda berencana meneruskan nilai-nilai ini ke dialer), Anda mungkin tidak ingin meronta-ronta input pengguna selama validasi, terutama jika Anda ingin mereka melakukan koreksi di bidang lain.

Steve
sumber
22

Perhatikan bahwa ()karakter stripping tidak berfungsi untuk gaya penulisan angka UK yang umum: +44 (0) 1234 567890yang berarti memanggil nomor internasional:
+441234567890
atau dalam dial Inggris01234567890

Ben Clifford
sumber
15

Sudahkah Anda melihat RegExLib ?

Memasukkan nomor telepon AS membawa kembali sejumlah kemungkinan.

Rob Wells
sumber
3
Ini terlihat seperti cara yang bagus untuk mengintegrasikan bug yang tidak dikenal ke dalam kode Anda.
Tom Lord
12

Upaya saya di regex tidak terbatas:

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

Menerima:

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

Tolak:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

Terserah Anda untuk membersihkannya untuk tampilan. Setelah memvalidasi itu bisa berupa angka.

ReactiveRaven
sumber
12

Saya menemukan ini bekerja dengan cukup baik:

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

Ini berfungsi untuk format angka ini:

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

Pastikan untuk menggunakan flag global DAN multiline untuk memastikan.

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

Herobrine2Nether
sumber
11

Jika Anda berbicara tentang validasi formulir, regexp untuk memvalidasi makna yang benar serta data yang benar akan menjadi sangat kompleks karena berbagai negara dan standar penyedia. Ini juga akan sulit untuk tetap up to date.

Saya menafsirkan pertanyaan sebagai mencari pola yang valid secara luas, yang mungkin tidak konsisten secara internal - misalnya memiliki serangkaian angka yang valid, tetapi tidak memvalidasi bahwa garis trunk, pertukaran, dll ke pola yang valid untuk awalan kode negara .

Amerika Utara sangat mudah, dan untuk internasional saya lebih suka menggunakan pola 'idiomatik' yang mencakup cara orang menentukan dan mengingat jumlah mereka:

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

Pola Amerika Utara memastikan bahwa jika satu kurung dimasukkan keduanya. Akun internasional untuk inisial '+' opsional dan kode negara. Setelah itu, Anda berada dalam idiom. Pertandingan yang valid adalah:

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

Ini mungkin bias karena pengalaman saya terbatas di Amerika Utara, Eropa dan sedikit Asia.

ron0
sumber
Saya sudah mencoba menerapkan hal di atas dalam skrip validasi javascript saya, tetapi saya terus mendapatkan invalid quantifierkesalahan. Ada gagasan tentang apa yang saya lakukan salah?
Jannis
Saya akan menambahkan kasus sepele di mana ponsel ditentukan tanpa simbol tetapi mungkin spasi dan kode negara, di Eropa adalah tipikal untuk nomor lokal dan seluler: 676412342, 676 46 32 12, 676 463 212
rupps
11

Berikut adalah pola yang luar biasa yang paling cocok dengan validasi yang perlu saya capai. Saya bukan penulis asli, tetapi saya pikir ini layak untuk dibagikan karena saya menemukan masalah ini sangat kompleks dan tanpa jawaban singkat atau bermanfaat.

Regex berikut akan menangkap kombinasi angka dan karakter yang digunakan secara luas dalam berbagai format nomor telepon global:

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

Positif:
+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

Negatif:
926 3 4
8 800 600-APPLE

Sumber asli: http://www.regexr.com/38pvb

Stuart Kershaw
sumber
Ini memiliki beberapa dukungan terbatas untuk ekstensi. Ini cocok dengan "616-555-1234 x567" tetapi tidak "616-555-1234 ext. 567".
Jon Schneider
2
Positif salah untuk misalnya "------- (((((((55555555" "atau" 9999999999999999999999999 ""
mikep
Itu tidak memvalidasi nomor macdonalds Nitherland +31 76 596 4192 (Saya baru saja menguji untuk nomor acak)
BIOHAZARD
10

Perasaan saya diperkuat oleh jumlah balasan untuk topik ini - bahwa ada sejumlah solusi yang tak terbatas untuk masalah ini, tidak ada yang akan menjadi elegan.

Jujur, saya sarankan Anda tidak mencoba memvalidasi nomor telepon. Bahkan jika Anda dapat menulis validator besar dan berbulu yang akan memungkinkan semua format sah yang berbeda, itu akan berakhir dengan memungkinkan hampir semua hal yang bahkan menyerupai nomor telepon.

Menurut pendapat saya, solusi paling elegan adalah memvalidasi panjang minimum, tidak lebih.

mindplay.dk
sumber
Setelah mencoba beberapa dari ini dan melalui data yang ada dan umpan balik dari pengguna saya akan cenderung setuju ...
Christopher King
Namun terkadang Anda perlu melakukan validasi. Jika saya mengirim kode konfirmasi saya tidak bisa hanya mengirim kode ke sembarang sampah yang dimasukkan oleh spammer di bidang ini. Saya ingin memastikan jumlahnya mungkin nomor telepon sebelum membuang-buang sumber daya untuk mengirim pesan.
Luke
10

Ini adalah pola Ekspresi Reguler sederhana untuk Nomor Ponsel Filipina:

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

atau

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

akan cocok dengan ini:

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

Yang pertama akan cocok dengan kode negara APAPUN dua digit, sedangkan yang kedua akan cocok dengan kode negara Filipina secara eksklusif.

Uji di sini: http://refiddle.com/1ox

GaiusSensei
sumber
Terima kasih. Bagaimana dengan nomor darat dengan kode area seperti 028231234? Saya ingin tahu apakah kode area hanya 2-3 angka dan apakah selalu diawali dengan 0?
stormwild
9

Inilah upaya terbaik saya sejauh ini. Ini menangani format di atas tapi saya yakin saya kehilangan beberapa format lain yang mungkin.

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$
Nicholas Trandem
sumber
9

Anda akan mengalami kesulitan berurusan dengan nomor internasional dengan regex tunggal / sederhana, lihat posting ini pada kesulitan nomor telepon internasional (dan bahkan Amerika Utara).

Anda ingin menguraikan beberapa digit pertama untuk menentukan apa kode negara itu, lalu bertindak berbeda berdasarkan negara tersebut.

Di luar itu - daftar yang Anda berikan tidak menyertakan format umum AS lainnya - meninggalkan yang pertama. 1. Sebagian besar ponsel di AS tidak memerlukannya, dan itu akan mulai membingungkan generasi yang lebih muda kecuali mereka telah memanggil nomor internasional.

Anda telah mengidentifikasi dengan benar bahwa ini masalah rumit ...

-Adam

Adam Davis
sumber
Bukan solusi yang ditawarkan. MUNGKIN. Hanya karena rumit atau rumit bukan berarti Anda harus mengangkat tangan.
Eric Hodonsky
7

Setelah membaca jawaban-jawaban ini, sepertinya tidak ada ekspresi reguler langsung yang dapat menguraikan banyak teks dan mengeluarkan nomor telepon dalam format apa pun (termasuk internasional dengan dan tanpa tanda tambah).

Inilah yang saya gunakan untuk proyek klien baru-baru ini, di mana kami harus mengubah semua nomor telepon dalam format apa pun menjadi tel: tautan.

Sejauh ini, sudah bekerja dengan semua yang mereka lakukan, tetapi jika kesalahan muncul, saya akan memperbarui jawaban ini.

Regex:

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

PHP berfungsi untuk mengganti semua nomor telepon dengan tautan tel: (jika ada yang penasaran):

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;
}
Drew Thomas
sumber
Ekspresi reguler ini cocok +1 1234562222222222222222222222.
Varda Elentári
mengapa tidak kembali saja?
thexande
Positif salah untuk "99999999999999999999999999999999999999999"
Ben Wheeler
6

Saya percaya bahwa Number :: Phone :: US dan Regexp :: Common (khususnya sumber dari Regexp :: Common :: URI :: RFC2806 ) Modul Perl dapat membantu.

Pertanyaannya mungkin harus dirinci sedikit lebih rinci untuk menjelaskan tujuan memvalidasi angka. Misalnya, 911 adalah angka yang valid di AS, tetapi 911x bukan untuk nilai x. Itu agar perusahaan telepon dapat menghitung ketika Anda selesai melakukan panggilan. Ada beberapa variasi tentang masalah ini. Tetapi regex Anda tidak memeriksa bagian kode area, sehingga sepertinya tidak menjadi masalah.

Seperti memvalidasi alamat email, bahkan jika Anda memiliki hasil yang valid, Anda tidak dapat mengetahui apakah itu ditugaskan kepada seseorang sampai Anda mencobanya.

Jika Anda mencoba memvalidasi input pengguna, mengapa tidak menormalkan hasilnya dan selesai dengan itu? Jika pengguna memasukkan nomor yang tidak dapat Anda kenali sebagai nomor yang valid, simpan nomor tersebut sebagai yang dimasukkan atau hapus karakter yang tidak tersedia. The Number :: Phone :: Menormalkan modul Perl bisa menjadi sumber inspirasi.

Jon Ericson
sumber
Saya akan pergi mengambil risiko di sini dan mengatakan bahwa mengizinkan 911 sebagai nomor telepon mungkin merupakan ide yang buruk di hampir semua aplikasi regex ini. Tangkapan yang bagus.
Nicholas Flynt
4

Saya bekerja untuk perusahaan riset pasar dan kami harus menyaring jenis input ini sepanjang waktu. Anda terlalu menyulitkan. Cukup cabut karakter non-alfanumerik, dan lihat apakah ada ekstensi.

Untuk analisis lebih lanjut, Anda dapat berlangganan ke salah satu dari banyak penyedia yang akan memberi Anda akses ke basis data angka yang valid serta memberi tahu Anda apakah itu sambungan telepon rumah atau ponsel, terputus, dll. Dibutuhkan biaya.

Joe Phillips
sumber
Validasi? 123% $) *% () $ * () # 456 * () * $ # (* (# $ @ 8908 akan cocok dengan solusi yang Anda ajukan.
PlexQ
1
@PlexQ 555-123-1234, 077777777777, 90210, 01/01/1901 - pengguna inventif dalam mengumpulkan sampah melalui validasi. Lebih baik tidak mengabaikan orang-orang yang benar-benar memiliki beberapa data aneh dengan menggunakan validasi yang terlalu ketat dan mengatakan bahwa mereka salah.
ReactiveRaven
4

Lakukan penggantian pada pemformatan karakter, lalu periksa sisanya untuk validitas ponsel. Dalam PHP,

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

Menghancurkan regexp kompleks seperti ini bisa sama efektifnya, tetapi jauh lebih sederhana.

rooskie
sumber
3

Saya menemukan ini sebagai sesuatu yang menarik. Saya belum mengujinya tetapi sepertinya itu akan berhasil

<?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.';
}
?>
Chris
sumber
4
Pesan Anda tampaknya menunjukkan bahwa Anda tidak menulis kode ini. Maukah Anda mengutip sumber, tolong?
Alastair Irvine
bitrepository.com/how-to-validate-a-telephone-number.html tampaknya menjadi sumbernya.
James Paterson
3

Anda mungkin akan lebih baik menggunakan Input Bertopeng untuk ini. Dengan begitu pengguna HANYA dapat memasukkan angka dan Anda dapat memformat sesuka Anda. Saya tidak yakin apakah ini untuk aplikasi web, tetapi jika itu ada plugin jQuery sangat klik yang menawarkan beberapa opsi untuk melakukan ini.

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

Mereka bahkan membahas cara menutupi input nomor telepon dalam tutorial mereka.

Abe Miessler
sumber
3

Ini salah satu yang berfungsi dengan baik dalam JavaScript. Ada dalam string karena itulah yang diharapkan widget Dojo.

Ini cocok dengan 10 digit nomor NANP Amerika Utara dengan ekstensi opsional. Spasi, tanda hubung, dan titik adalah pembatas yang diterima.

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

Saya sedang berjuang dengan masalah yang sama, mencoba membuat bukti aplikasi saya di masa depan, tetapi orang-orang ini membuat saya pergi ke arah yang benar. Saya tidak benar-benar memeriksa nomor itu sendiri untuk melihat apakah itu berfungsi atau tidak, saya hanya mencoba memastikan bahwa serangkaian angka dimasukkan yang mungkin atau mungkin tidak memiliki ekstensi.

Skenario kasus terburuk jika pengguna harus menarik nomor yang tidak diformat dari file XML, mereka masih akan cukup mengetikkan angka-angka ke dalam numberpad ponsel 012345678x5, tidak ada alasan nyata untuk tetap cantik. RegEx semacam itu akan keluar seperti ini untuk saya:

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

Kecenderungan saya adalah menyetujui bahwa menelanjangi non-digit dan hanya menerima apa yang terbaik. Mungkin untuk memastikan setidaknya beberapa digit hadir, meskipun itu tidak melarang sesuatu seperti nomor telepon alfabet "ASK-JAKE" misalnya.

Beberapa ekspresi perl sederhana mungkin:

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

Gunakan yang pertama untuk menjaga grup digit bersama-sama, yang dapat memberikan petunjuk format. Gunakan yang kedua untuk melemparkan semua non-digit secara sepele.

Apakah khawatir bahwa mungkin perlu ada jeda dan memasukkan lebih banyak kunci? Atau sekitar 555-1212 (tunggu bip) 123?

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

Harus diakhiri dengan angka, dapat dimulai dengan (atau + atau angka, dan dapat berisi + - (atau)

Ian
sumber
2

Bagi siapa pun yang tertarik melakukan sesuatu yang mirip dengan nomor ponsel Irlandia, berikut cara mudah untuk mencapainya:

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

Ada juga solusi JQuery pada tautan itu.

EDIT:

solusi 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();
});


});

Sumber .

Lajos Arpad
sumber