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.
regex
validation
phone-number
Nicholas Trandem
sumber
sumber
555
mereka terpisah911
?Jawaban:
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:
Kemudian ketika Anda menampilkan, format ulang ke isi hati Anda. misalnya
sumber
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:
sumber
/(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})/
(?:(?:(\s*\(?([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\)?\s*(?:[.-]\s*)?)([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})
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:
sumber
Saya juga menyarankan melihat Perpustakaan Google " libphonenumber ". Saya tahu ini bukan regex tetapi ia melakukan apa yang Anda inginkan.
Misalnya, ia akan mengenali bahwa:
adalah angka yang mungkin tetapi bukan angka yang valid. Ini juga mendukung negara-negara di luar AS.
Sorotan fungsionalitas:
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.
(408) 974–2042
adalah nomor AS yang valid(999) 974–2042
adalah tidak valid nomor AS0404 999 999
adalah nomor Australia yang valid(02) 9999 9999
juga nomor Australia yang valid(09) 9999 9999
adalah tidak valid nomor AustraliaPersamaan 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 darilibphonenumber
(tautan ke demo online) :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,
libphonenumber
memiliki 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:libphonenumber juga memberi Anda banyak manfaat tambahan, seperti mengambil lokasi tempat nomor telepon terdeteksi, dan juga mendapatkan informasi zona waktu dari nomor telepon:
Tetapi nomor telepon Australia yang tidak valid (
(09) 9999 9999
) mengembalikan bahwa itu bukan nomor telepon yang valid.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.
sumber
07700000000
saya mendapatkanMissing or invalid default region.
kesalahan. Tetapi jika saya menentukan kode negara itu akan berlalu./^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i
Ini cocok:
Pada $ n, ini menghemat:
Anda dapat mengujinya di https://www.regexpal.com/?fam=99127
sumber
^
dan$
atau saya bisa menyiasatinya menggunakan[111] [111] [1111]
atau111--111--1111
dan sejenisnya. (maaf, hapus komentar terakhir saya)^
dan$
?[111] [111] [1111]
dan111--111--1111
sampai saya dihapus^
dan$
dari regex.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:
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.
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.
sumber
(4570457-6789
yang akan menjadi kesalahan ketik yang cukup umum. Grup pertandingan juga akan miring: rubular.com/r/TaTP0mHL5c(^|[^\d\n])
(dengan bendera multiline aktif) menghindari masalah umum, dengan memastikan itu tidak segera didahului oleh sesuatu yang numerik.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
/^
[\s]
atau\s
[(]
dan[)]
. Menggunakan\(
dan\)
jelek dan dapat membuat hal-hal membingungkan.?
setelahnya-
atau[-]
. Jika Anda tidak menempatkannya di urutan pertama atau terakhir di serangkaian karakter lain, Anda mungkin perlu menghindarinya:\-
[-.\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.[246]
akan membutuhkan 2, 4, atau 6.[77|78]
akan membutuhkan 77 atau 78.$/
: Akhiri ekspresisumber
[2-9]
blok yang saya taruh di sana. Itu berarti min Anda adalah 2, dan maks. Anda adalah 9. Sesuaikan.Saya menulis paling sederhana (walaupun saya tidak perlu dot di dalamnya).
Seperti disebutkan di bawah, ini hanya memeriksa karakter, bukan struktur / urutannya
sumber
Jika Anda hanya ingin memverifikasi bahwa Anda tidak memiliki sampah acak di lapangan (mis., Dari spammer formulir) regex ini dapat digunakan dengan baik:
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
,t
hadir.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.
sumber
Perhatikan bahwa
()
karakter stripping tidak berfungsi untuk gaya penulisan angka UK yang umum:+44 (0) 1234 567890
yang berarti memanggil nomor internasional:+441234567890
atau dalam dial Inggris
01234567890
sumber
Sudahkah Anda melihat RegExLib ?
Memasukkan nomor telepon AS membawa kembali sejumlah kemungkinan.
sumber
Upaya saya di regex tidak terbatas:
Menerima:
Tolak:
Terserah Anda untuk membersihkannya untuk tampilan. Setelah memvalidasi itu bisa berupa angka.
sumber
Saya menemukan ini bekerja dengan cukup baik:
Ini berfungsi untuk format angka ini:
Pastikan untuk menggunakan flag global DAN multiline untuk memastikan.
Tautan: http://www.regexr.com/3bp4b
sumber
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:
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.
sumber
invalid quantifier
kesalahan. Ada gagasan tentang apa yang saya lakukan salah?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
sumber
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.
sumber
Ini adalah pola Ekspresi Reguler sederhana untuk Nomor Ponsel Filipina:
atau
akan cocok dengan ini:
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
sumber
Inilah upaya terbaik saya sejauh ini. Ini menangani format di atas tapi saya yakin saya kehilangan beberapa format lain yang mungkin.
sumber
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
sumber
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):
sumber
+1 1234562222222222222222222222
.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.
sumber
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.
sumber
Lakukan penggantian pada pemformatan karakter, lalu periksa sisanya untuk validitas ponsel. Dalam PHP,
Menghancurkan regexp kompleks seperti ini bisa sama efektifnya, tetapi jauh lebih sederhana.
sumber
Saya menemukan ini sebagai sesuatu yang menarik. Saya belum mengujinya tetapi sepertinya itu akan berhasil
sumber
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.
sumber
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.
sumber
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:01234467 extension 123456
01234567x123456
01234567890
sumber
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:
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?
sumber
Harus diakhiri dengan angka, dapat dimulai dengan (atau + atau angka, dan dapat berisi + - (atau)
sumber
Bagi siapa pun yang tertarik melakukan sesuatu yang mirip dengan nomor ponsel Irlandia, berikut cara mudah untuk mencapainya:
http://ilovenicii.com/?p=87
PHP
Ada juga solusi JQuery pada tautan itu.
EDIT:
solusi jQuery:
Sumber .
sumber