Saya tahu bahwa ini adalah postingan lama, tetapi semua ekspresi reguler di sini kehilangan satu komponen yang sangat penting: dukungan untuk nama domain IDN.
Nama domain IDN dimulai dengan xn--. Mereka mengaktifkan karakter UTF-8 yang diperpanjang dalam nama domain. Misalnya, tahukah Anda "♡ .com" adalah nama domain yang valid? Ya, "cinta hati dot com"! Untuk memvalidasi nama domain, Anda harus membiarkan http://xn--c6h.com/ lolos validasi.
Catatan, untuk menggunakan regex ini, Anda perlu mengonversi domain ke huruf kecil, dan juga menggunakan pustaka IDN untuk memastikan Anda mengenkode nama domain ke ACE (juga dikenal sebagai "Pengkodean Kompatibel ASCII"). Salah satu perpustakaan yang bagus adalah GNU-Libidn.
idn (1) adalah antarmuka baris perintah ke perpustakaan nama domain internasional. Contoh berikut mengonversi nama host dalam UTF-8 menjadi pengkodean ACE. URL yang dihasilkan https: //nic.xn--flw351e/ kemudian dapat digunakan sebagai ekuivalen yang dienkode-ACE dari https: // nic. 谷 歌 / .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Ekspresi reguler ajaib ini harus mencakup sebagian besar domain (meskipun, saya yakin ada banyak kasus tepi valid yang saya lewatkan):
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Saat memilih regex validasi domain, Anda akan melihat apakah domain tersebut cocok dengan yang berikut:
- xn--stackoverflow.com
- stackoverflow.xn - com
- stackoverflow.co.uk
Jika ketiga domain ini tidak lolos, ekspresi reguler Anda mungkin tidak mengizinkan domain yang sah!
Lihat halaman Dukungan Nama Domain Internasional dari Panduan Lingkungan Bahasa Internasional Oracle untuk informasi lebih lanjut.
Silakan mencoba regex di sini: http://www.regexr.com/3abjr
ICANN menyimpan daftar tld yang telah didelegasikan yang dapat digunakan untuk melihat beberapa contoh domain IDN.
Edit:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Persamaan reguler ini akan menghentikan domain yang memiliki tanda '-' di akhir hostname sebagai ditandai sebagai valid. Selain itu, ini memungkinkan subdomain tidak terbatas.