Regex untuk Validasi Email, URL, dan Nomor Telepon
Regex validasi adalah jenis yang paling sering disalin, dan banyak di antaranya diam-diam keliru. Berikut pola yang berfungsi di form sungguhan, fungsi tiap bagiannya, dan kasus ketika regular expression ternyata alat yang salah.
Validasi secara longgar, verifikasi secara nyata
Regex hanya bisa memberi tahu bahwa input terlihat seperti alamat email; hanya dengan mengirim pesan kita bisa membuktikan alamat itu benar-benar ada. Pola yang terlalu ketat menolak pengguna sungguhan, misalnya yang memakai tanda plus, domain panjang, atau nama internasional, sementara typo justru lolos. Targetkan pola yang menangkap kesalahan jelas, lalu lakukan verifikasi.
Alamat email
Pola praktis yang cocok dengan hampir semua alamat email sungguhan:
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Ada teks, sebuah @, domain dengan titik, dan tanpa spasi. Pola ini menerima ada+news@example.co.uk dan menolak ada@example serta ada @example.com. Versi yang sedikit lebih ketat untuk bagian lokal:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Pola ini menolak alamat internasional (seperti josé@example.com), jadi pilih yang pertama jika penggunamu tersebar di seluruh dunia. Di HTML, <input type="email"> sudah melakukan validasi dengan aturan bawaan browser. Untuk memastikan sebuah domain benar-benar bisa menerima surat, cek rekaman MX-nya dengan Email DNS Checker.
URL
Jangan menulis regex untuk URL, cukup parse. Setiap runtime modern punya parser URL yang sudah memahami aturannya:
function isHttpUrl(value) {
try {
const u = new URL(value);
return u.protocol === 'http:' || u.protocol === 'https:';
} catch {
return false;
}
}
Memeriksa protokol itu penting: new URL('javascript:alert(1)') tetap terurai tanpa error, dan string seperti itu tidak boleh sampai masuk ke href. Jika kamu butuh regex untuk menemukan URL dalam teks, gunakan yang sederhana lalu parse setiap hasil kecocokannya:
https?:\/\/[^\s<>"']+
Pecah URL menjadi protokol, host, path, dan parameter query dengan URL Parser.
Nomor telepon
Format telepon berbeda-beda tiap negara, jadi regex yang paling aman hanya membersihkan input. Hapus semua karakter selain angka dan tanda plus di awal, lalu periksa panjangnya terhadap E.164 (maksimal 15 digit):
const clean = input.replace(/(?!^\+)[^\d]/g, '');
const ok = /^\+?[1-9]\d{6,14}$/.test(clean);
Untuk validasi nyata per negara, seperti kode area dan perbedaan nomor seluler vs telepon rumah, gunakan library seperti libphonenumber. Berikut pola khusus Amerika Utara, jika itu satu-satunya yang kamu terima:
^\(?([2-9]\d{2})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$
Uji sebelum rilis
Tempel pola ke Regex Tester beserta daftar sampel valid dan tidak valid, satu per baris, lalu aktifkan flag multiline agar ^ dan $ cocok di setiap baris. Jika pola warisan yang kamu terima sulit dibaca, Regex Explainer akan memecahnya token demi token. Waspadai catastrophic backtracking: quantifier bersarang seperti (a+)+ bisa membuat server macet saat menerima input yang sengaja dibuat untuk itu.