Saya perlu memvalidasi nama domain:
google.com
stackoverflow.com
Jadi domain dalam bentuknya yang paling mentah - bahkan bukan subdomain seperti www.
- Karakter hanya boleh az | AZ | 0-9 dan titik (.) Dan tanda hubung (-)
- Bagian nama domain tidak boleh diawali atau diakhiri dengan tanda hubung (-) (mis. -Google-.com)
- Bagian nama domain harus memiliki panjang antara 1 dan 63 karakter
Ekstensi (TLD) dapat berupa apa saja di bawah aturan # 1 untuk saat ini, saya dapat memvalidasinya terhadap daftar nanti, namun harus 1 atau lebih karakter
Sunting: TLD tampaknya 2-6 karakter seperti aslinya
tidak. 4 direvisi: TLD seharusnya benar-benar diberi label "subdomain" karena harus menyertakan hal-hal seperti .co.uk - Saya membayangkan satu-satunya validasi yang mungkin (selain memeriksa daftar) adalah 'setelah titik pertama seharusnya ada satu atau lebih banyak karakter di bawah aturan # 1
Terima kasih banyak, percayalah, saya sudah mencoba!
regex
validation
domain-name
Dominic
sumber
sumber
Jawaban:
Yah, itu
cukup sederhanasedikit lebih licik daripada yang terlihat (lihat komentar), mengingat persyaratan spesifik Anda:Tapi perhatikan ini akan menolak banyak domain yang valid.
sumber
g.co
adalah nama domain yang valid tetapig
hanya satu karakter./^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/
. Tapi ini masih menolak banyak hal yang valid ...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. 谷 歌 / .
Ekspresi reguler ajaib ini harus mencakup sebagian besar domain (meskipun, saya yakin ada banyak kasus tepi valid yang saya lewatkan):
Saat memilih regex validasi domain, Anda akan melihat apakah domain tersebut cocok dengan yang berikut:
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:
Persamaan reguler ini akan menghentikan domain yang memiliki tanda '-' di akhir hostname sebagai ditandai sebagai valid. Selain itu, ini memungkinkan subdomain tidak terbatas.
sumber
/^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
to.
( to. ) Adalah url valid dengan konten.to.
bukan nama domain yang sepenuhnya memenuhi syarat. Jika Anda ingin mengizinkan domain tingkat atas, maka Anda harus menggunakan sesuatu seperti^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$
, tetapi berhati-hatilah, Anda akan membiarkan orang memasukkan domain sepertitest
atauna
, juga!invali.d
sebagai nama domain yang valid sementarainvali.d.co.uk
tidak valid.xn--stackoverflow.com
ini bukan nama yang valid karena 'stackoverflow' tidak dapat diubah dari Punycode. Namun itu di luar kemampuan regex. Sebagai pernyataan umum,xn--[a-z0-9]+
label hanya akan IDN sedangkanxn--[a-z0-9]+\-[a-z0-9]+
menunjukkan campuran karakter ASCII dan non-ASCIIRegEx saya berikutnya:
^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$
tidak apa-apa untuk i.oh1.me dan untuk wow.british-library.uk
UPD
Berikut adalah aturan yang diperbarui
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
sekarang itu memeriksa
-
atau_
di awal atau akhir label domain.sumber
{2,6}
kriterianya perlu diperbarui untuk TLD baru. Mungkin{2,}
.Taruhanku:
Dijelaskan:
Nama domain dibangun dari segmen. Berikut adalah satu segmen (kecuali final):
Ini dapat memiliki 1-63 karakter, tidak dimulai atau diakhiri dengan '-'.
Sekarang tambahkan '.' untuk itu dan ulangi setidaknya satu kali:
Kemudian lampirkan segmen terakhir, yang panjangnya 2-63 karakter:
Uji di sini: http://regexr.com/3au3g
sumber
Hanya koreksi kecil - bagian terakhir harus sampai 6. Oleh karena itu,
TLD terpanjang adalah
museum
(6 karakter) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domainssumber
.photography
available
tlds saat ini bukanlah bukti masa depan.{2,63}
: lihat stackoverflow.com/questions/9238640/…Jawaban yang diterima tidak berfungsi untuk saya, coba ini:
Kunjungi Kasus Uji Unit ini untuk validasi.
sumber
{2,6}
ke sesuatu yang lain dan itu akan berhasil.^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Jawaban ini untuk nama domain (termasuk RR layanan), bukan nama host (seperti nama host email).
Ini pada dasarnya adalah jawaban mkyong dan sebagai tambahan:
Menurut Bagian
Lihatlah, batasi panjang maksimal antara ^ $ hingga 253 karakter dengan opsional '.'
Lihatlah, karakter berikutnya bukan '-' dan tidak ada '_' yang mengikuti karakter apa pun sebelum karakter berikutnya '.'. Artinya, tegakkan bahwa karakter pertama label bukanlah '-' dan hanya karakter pertama yang boleh jadi '_'.
Antara 1 dan 63 karakter yang diizinkan per label.
Lihat di belakang, karakter sebelumnya bukan '-'. Artinya, tegakkan bahwa karakter terakhir label bukanlah '-'.
Paksa '.' di akhir setiap label kecuali yang terakhir, yang bersifat opsional.
Sebagian besar digabungkan dari atas, ini membutuhkan setidaknya dua tingkat domain, yang tidak sepenuhnya benar, tetapi biasanya merupakan asumsi yang masuk akal. Ubah dari {2,} ke + jika Anda ingin mengizinkan TLD atau subdomain relatif yang tidak memenuhi syarat melalui (misalnya, localhost, myrouter, ke.)
Tes unit untuk ekspresi ini.
sumber
Terima kasih telah menunjukkan arah yang benar dalam solusi validasi nama domain di jawaban lain. Nama domain dapat divalidasi dengan berbagai cara.
Jika Anda perlu memvalidasi domain IDN dalam bentuk yang dapat dibaca manusia , regex
\p{L}
akan membantu. Ini memungkinkan untuk mencocokkan karakter apa pun dalam bahasa apa pun.Perhatikan bahwa bagian terakhir mungkin juga berisi tanda hubung ! Karena kode Punycode, nama China mungkin memiliki karakter unicode di tld.
Saya telah sampai pada solusi yang cocok misalnya:
Regex adalah:
Periksa dan dengarkan di sini
CATATAN: Regexp ini cukup permisif, seperti nama domain saat ini yang diperbolehkan kumpulan karakter.
PEMBARUAN : Bahkan lebih disederhanakan,
a-aA-Z\p{L}
sama seperti biasa\p{L}
CATATAN2: Satu-satunya masalah adalah itu akan cocok dengan domain dengan titik ganda di dalamnya ..., seperti
masełk..owski.pl
. Jika ada yang tahu cara memperbaikinya, harap perbaiki.sumber
[:alpha:]
dan[:digit]
sebagai gantinya\p{L}
. Ini bekerja dengan baik.中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国
periksa sebagai valid, tetapi setelah konversi IDN, terlalu banyak byte per label. \ p {L} mencocokkan simbol, bukan byte punycode (yang bervariasi dari simbol ke simbol), jadi penghitungan berulang tidak membantu saat mencoba membatasi ukuran pasca-konversi.[domain - hanya huruf kecil dan 0-9] [dapat memiliki tanda hubung] + [TLD - hanya huruf kecil, harus terdiri dari 2 dan 7 huruf]
http://rubular.com/ sangat bagus untuk menguji ekspresi reguler!
Sunting: Diperbarui TLD maksimum hingga 7 karakter untuk '.rentals' seperti yang ditunjukkan Dan Caddigan.
sumber
.photography
tidak valid. Buat saja karakter tanpa batas atau semacamnya.Belum cukup perwakilan untuk berkomentar. Menanggapi solusi paka, saya merasa perlu menyesuaikan tiga item:
Sebelum:
Setelah:
sumber
Untuk gTLD baru
sumber
Seperti yang telah ditunjukkan, tidak jelas untuk memberi tahu subdomain dalam arti praktis (misalnya
.co.uk
domain). Kami menggunakan regex ini untuk memvalidasi domain yang terjadi di alam liar. Ini mencakup semua kasus penggunaan praktis yang saya ketahui. Yang baru dipersilakan. Menurut pedoman kami, ini menghindari grup yang tidak menangkap dan pencocokan serakah.^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$
Bukti, penjelasan, dan contoh: https://regex101.com/r/FLA9Bv/9 ( Catatan: saat ini hanya berfungsi di Chrome karena regex menggunakan lookbehinds yang hanya didukung di ECMA2018 )
Ada dua pendekatan yang dapat dipilih saat memvalidasi domain.
Pencocokan FQDN menurut buku (definisi teoretis, jarang ditemui dalam praktik):
Pencocokan FQDN praktis / konservatif (definisi praktis, diharapkan dan didukung dalam praktik):
[a-zA-Z0-9.-]
sumber
sumber
Berikut kode lengkapnya dengan contoh:
sumber
Terima kasih @mkyong atas dasar jawaban saya. Saya telah memodifikasinya untuk mendukung label yang dapat diterima lebih lama.
Selain itu, "localhost" secara teknis adalah nama domain yang valid. Saya akan mengubah jawaban ini untuk mengakomodasi nama domain internasional.
sumber
([a-zA-Z]{1,2})
-> untuk menerima hanya dua karakter.([0-9]{1,2})
-> untuk menerima dua nomor sajajika ada yang melebihi dua
([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])
, regex ini akan mengurusnya.Jika kita ingin melakukan pencocokan setidaknya satu kali
+
akan digunakan.sumber
Contoh yang berhasil:
Ini juga akan berfungsi untuk ekstensi
Contoh yang tidak akan berhasil:
itu akan bekerja bahkan dengan ekstensi domain terpanjang
".versicherung"
sumber
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$
akan memvalidasi domain tersebut seperti
яндекс.рф
setelah encoding.https://regex101.com/r/Hf8wFM/1 - kotak pasir
sumber
Regex berikut mengekstrak sub, root, dan tld dari domain tertentu:
Diuji untuk domain berikut:
sumber
Saya melakukan hal di bawah ini untuk mengambil domain bersama dengan protokolnya. Contoh: https://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M
gunakan pola Regex di bawah ini: [a-zA-Z0-9] +: //.*? /
akan memberi Anda output: https://www.facebook.com/ ftp://192.282.34.337/
sumber