Apakah ekspresi reguler yang cocok dengan nama domain yang valid tanpa subdomain?

123

Saya perlu memvalidasi nama domain:

google.com

stackoverflow.com

Jadi domain dalam bentuknya yang paling mentah - bahkan bukan subdomain seperti www.

  1. Karakter hanya boleh az | AZ | 0-9 dan titik (.) Dan tanda hubung (-)
  2. Bagian nama domain tidak boleh diawali atau diakhiri dengan tanda hubung (-) (mis. -Google-.com)
  3. Bagian nama domain harus memiliki panjang antara 1 dan 63 karakter
  4. 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!

Dominic
sumber
1
Mungkin tidak membantu sama sekali. Ketika berbicara tentang google.co.uk, dan beberapa domain Jepang, saya yakin Anda harus berpikir dua kali sebelum menggunakan regex untuk itu. Pemikiran pribadi saya adalah bahwa regex tidak cukup untuk memvalidasi domain ke domain kehidupan nyata. FYI, berikut adalah daftar yang hampir lengkap dari daftar domain tingkat kedua tlds dan kode negara: static.ayesh.me/misc/SO/tlds.txt
Ayesh K
1
Lihat jawaban saya untuk pertanyaan terkait tentang validasi nama host .
SAM
2
Sering dilupakan: Untuk nama domain berkualifikasi penuh, Anda harus mencocokkan titik setelah tld.
schmijos
1
sudah 4 tahun, sekarang hitungannya sampai 89.000
mydoglixu
1
Beberapa dari jawaban ini cukup bagus, tetapi ada juga jawaban bagus lainnya untuk pertanyaan lain ini yang layak untuk dilihat.
craftworkgames

Jawaban:

49

Yah, itu cukup sederhana sedikit lebih licik daripada yang terlihat (lihat komentar), mengingat persyaratan spesifik Anda:

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

Tapi perhatikan ini akan menolak banyak domain yang valid.

Cameron
sumber
Terima kasih, terima kasih yang ini sepertinya berhasil. Jenis domain apa yang tidak lolos validasi, tahukah Anda?
Dominic
12
@ infensus - Meskipun regex ini benar berdasarkan spesifikasi Anda, namun spesifikasi Anda salah. g.coadalah nama domain yang valid tetapi ghanya satu karakter.
sch
3
Ini harus cocok dengan semua kasus yang menurut saya: ^ ([a-z0-9]) (([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [a-z0-9] (([a-z0-9 -] {1,61})? [a-z0-9] {1})?)? (\. [a-zA-Z] {2 , 4}) + $
transilvlad
1
x.com tidak akan lewat di sini
Neil McGuigan
4
@Neil: Kamu benar. Pertanyaan asli meminta 3-63 karakter (lihat edit 3). Hal ini dapat diubah untuk mendukung domain satu-karakter cukup mudah: /^[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 ...
Cameron
85

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:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - com
  3. 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.

Tim Groeneveld
sumber
1
Perhatikan bahwa ini hanya akan mendukung maksimal satu subdomain, jika lebih dari itu akan menghasilkan false. Ini bukan sesuatu yang Anda fitnah kecuali menggunakannya untuk situs internal, dll ... Upaya cepat untuk memungkinkannya mendukung lebih banyak subdomain:/^((?!-))(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
stakolee
1
Tapi lonely tld's tidak berfungsi :( Misalnya to.( to. ) Adalah url valid dengan konten.
iiic
@iiic, ya, tetapi 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 seperti testatau na, juga!
Tim Groeneveld
Ini menerima invali.dsebagai nama domain yang valid sementara invali.d.co.uktidak valid.
Pawel Krakowiak
1
Perlu dicatat bahwa xn--stackoverflow.comini 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 sedangkan xn--[a-z0-9]+\-[a-z0-9]+menunjukkan campuran karakter ASCII dan non-ASCII
Marcus
50

RegEx 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

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Visualisasi ekspresi reguler

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

sekarang itu memeriksa -atau _di awal atau akhir label domain.

paka
sumber
9
Kelihatannya cukup bagus, tetapi {2,6}kriterianya perlu diperbarui untuk TLD baru. Mungkin {2,}.
jwatts1980
@ jwatts1980 apakah ada contoh zona seperti itu? atau maksud Anda untuk kemungkinan zona masa depan?
paka
1
Berikut adalah artikel yang membahas perubahan yang akan datang dengan contoh-contoh dan link ke sumber daya terkait: zdnet.com/...
jwatts1980
1
Mengapa ([a-zA-Z] {1} [a-zA-Z] {1}) dan bukan ([a-zA-Z] {2})?
Anton
3
bagian terakhir dengan dua alternatif juga salah: terdapat ccTLD (dua huruf) yang menerima sublabel IDNA. Ada juga sekarang label TLD sudah menggunakan label IDNA. Anda tidak boleh menggunakan kasus khusus, label terakhir yang tidak berbeda dari yang lain (dan sekarang memiliki banyak ekstensi yang ditambahkan dengan panjang variabel, hanya saja seperti semua label lain di subdomain. Perhatikan label IDNA juga mungkin muncul Punycoded (dalam hal ini akan ada "- - "segmen dalam label, satu-satunya kasus di mana" - "diizinkan dalam label .. Terakhir, garis bawah tidak valid di semua label.
verdy_p
24

Taruhanku:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

Dijelaskan:

Nama domain dibangun dari segmen. Berikut adalah satu segmen (kecuali final):

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

Ini dapat memiliki 1-63 karakter, tidak dimulai atau diakhiri dengan '-'.

Sekarang tambahkan '.' untuk itu dan ulangi setidaknya satu kali:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

Kemudian lampirkan segmen terakhir, yang panjangnya 2-63 karakter:

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

Uji di sini: http://regexr.com/3au3g

Yaroslav Stavnichiy
sumber
@GaneshBabu Apa yang Anda maksud dengan kecocokan persis?
Yaroslav Stavnichiy
1
Semua jawaban lain tidak berhasil untuk saya, tetapi yang ini berhasil.
Danny Coulombe
Saya memiliki persyaratan serupa di mana saya ingin menghindari titik koma dan koma pada akhirnya saya mencoba banyak tetapi tidak berhasil di bawah ini adalah Regex Saya menggunakan const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Baik itu memvalidasi jika saya menggunakan, dan; di antara tetapi gagal pada akhirnya untuk vliadate.
Harry
Saya menemukan beberapa domain yang seharusnya valid tetapi tidak valid dengan regex Anda. Misalnya редбулл.москва adalah domain yang valid atau juga редбулл.рф dan 红色 的 公牛. 中国
pubkey
1
@pubkey, Anda perlu mengonversi nama domain tersebut menjadi punycode . Nama sebenarnya untuk редбулл.москва adalah xn - 90afc0aazy.xn - 80adxhks Dan regex saya cocok dengannya.
Yaroslav Stavnichiy
13

Hanya koreksi kecil - bagian terakhir harus sampai 6. Oleh karena itu,

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

TLD terpanjang adalah museum(6 karakter) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

ahadinyoto
sumber
3
Catatan: Ini tidak akan meneruskan nama domain yang valid (namun jarang) www.my---domain.com
Chris Bier
17
Tidak memotongnya dengan TLD baru misalnya.photography
Sam Figueroa
2
@SamFigueroa Anda hanya perlu memodifikasi panjangnya
Steel Brain
3
seharusnya tidak ada pemeriksaan untuk TLD itu tidak berbeda dari subdomain. Dan mendasarkan regex pada availabletlds saat ini bukanlah bukti masa depan.
Loïc Faure-Lacroix
1
Sarankan bit terakhir {2,63}: lihat stackoverflow.com/questions/9238640/…
Eric Dobbs
13

Jawaban yang diterima tidak berfungsi untuk saya, coba ini:

^ ((?! -) [A-Za-z0-9 -] {1,63} (? <! -) \.) + [A-Za-z] {2,6} $

Kunjungi Kasus Uji Unit ini untuk validasi.

mkyong
sumber
4
tidak ada dukungan untuk nama TLD baru yang lebih panjang seperti .audio, .photography, dan sebagian besar ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000
@ mrbinky3000 Ubah saja yang terakhir {2,6}ke sesuatu yang lain dan itu akan berhasil. ^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Milik
@Mygod regex Anda berisi beberapa sampah dengan lebar nol setelah tanda tanya terakhir, jadi siapa pun yang menyalinnya akan terkejut
MightyPork
1
@MightyPork Anda benar! Maaf, inilah versi bersih (mudah-mudahan):^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
Sangat bagus. Sayangnya, ekspresi lookbehind tidak valid di JavaScript. : /
PhiLho
13

Jawaban ini untuk nama domain (termasuk RR layanan), bukan nama host (seperti nama host email).

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

Ini pada dasarnya adalah jawaban mkyong dan sebagai tambahan:

  • Panjang maksimal 255 oktet termasuk prefiks panjang dan akar nol.
  • Izinkan jejak '.' untuk root dns eksplisit.
  • Izinkan memimpin '_' untuk RR domain layanan, (bug: tidak memberlakukan 15 karakter maks untuk _ label, juga tidak memerlukan setidaknya satu domain di atas RR layanan)
  • Cocok dengan semua TLD yang mungkin.
  • Tidak menangkap label subdomain.

Menurut Bagian

Lihatlah, batasi panjang maksimal antara ^ $ hingga 253 karakter dengan opsional '.'

(?=.{1,253}\.?$)

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.

[A-Za-z0-9-_]{1,63}

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.)

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

Tes unit untuk ekspresi ini.

Andrew Domaszek
sumber
1
Terima kasih! Ini adalah regex terbaik di sini. Penjelasan menyeluruh dan unit test Anda adalah bonus.
Naudster
Apa artinya "RR"?
wheeler
Catatan Sumber Daya. Biasanya teks atau bidang informasi yang memberi tahu Anda cara berinteraksi dengan layanan.
Andrew Domaszek
Regex ini salah. Misalnya domain redbull. 移动 valid tetapi regex tidak akan cocok.
pubkey
Konversikan ke punycode terlebih dahulu, lalu cocokkan. Batasan panjang pada versi pra-punycode sangat sulit diterapkan.
Andrew Domaszek
8

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:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心. 中国
  • xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s

Regex adalah:

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

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.

PeterM
sumber
Kami hanya dapat menggunakan [:alpha:]dan [:digit]sebagai gantinya \p{L}. Ini bekerja dengan baik.
puchu
Anda tidak dapat memvalidasi IDN dengan cara ini tanpa mengonversinya terlebih dahulu menjadi punycode. Misalnya dengan expr Anda, 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国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.
Andrew Domaszek
Poin bagus, setiap bagian dibatasi hingga 64 byte. Namun kami tidak dapat memeriksanya dengan RegExp, jadi langkah validasi lebih lanjut diperlukan menggunakan dekoder punycode - yang akan gagal dengan nama host contoh Anda. Orang Cina pasti marah dengan batasan ini.
PeterM
7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[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.

Chris
sumber
1
Mengapa membatasi TLD? Sekarang .photographytidak valid. Buat saja karakter tanpa batas atau semacamnya.
adriaan
5

Belum cukup perwakilan untuk berkomentar. Menanggapi solusi paka, saya merasa perlu menyesuaikan tiga item:

  • Tanda hubung dan garis bawah dipindahkan karena tanda hubung diartikan sebagai rentang (seperti dalam "0-9")
  • Menambahkan tanda titik untuk nama domain dengan banyak subdomain
  • Memperpanjang potensi panjang TLD menjadi 13

Sebelum:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Setelah:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$
zaTricky
sumber
3

Untuk gTLD baru

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu
Ben Keil
sumber
2
Tolong beri kami beberapa detail lebih lanjut. Apa jawaban Anda membuat lebih baik daripada yang lain? Mana yang lebih cocok? Harap edit posting Anda secara langsung untuk menambahkan informasi.
Sven R.
Seperti yang saya tulis: gTLD baru. Domain dengan karakter unicode dan juga TLD unicode.
Ben Keil
1
@BenKeil: Bagian ini tentang apa: (? <! -)
jor
@jor yang negatif lihat ke belakang. Lihat ini pintasfoo.com/app/dojos/regex/cheatsheet
Muhammad Faizan
3

Seperti yang telah ditunjukkan, tidak jelas untuk memberi tahu subdomain dalam arti praktis (misalnya .co.ukdomain). 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):

  • oleh-the-books yang cocok dengan pengecualian / penambahan berikut
  • karakter yang valid: [a-zA-Z0-9.-]
  • label tidak boleh dimulai atau diakhiri dengan tanda hubung (sesuai RFC-952 dan RFC-1123 / 2.1 )
  • Panjang minimal TLD adalah 2 karakter, panjang maksimal adalah 24 karakter sesuai catatan yang ada saat ini
  • tidak cocok dengan tanda titik
ini adalah desainku
sumber
2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$
Pengguna tidak diketahui
sumber
5
-1 untuk penambahan {2,4}. Dimungkinkan untuk memiliki TLD karakter tunggal (namun, saat ini tidak ada di root). Bagaimana dengan .mobile? .associates? Keduanya adalah TLD yang valid, dan akan ditolak oleh regex ini. data.iana.org/TLD/tlds-alpha-by-domain.txt
Tim Groeneveld
2

Berikut kode lengkapnya dengan contoh:

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false
Maulik Gangani
sumber
2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

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.

Nate Watson
sumber
0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> untuk menerima hanya dua karakter.

  • ([0-9]{1,2})-> untuk menerima dua nomor saja

jika 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.

priya
sumber
0

^ [a-zA-Z0-9] [- a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} (. [az] {2,3}) ? (. [az] {2,3})? $

Contoh yang berhasil:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

Ini juga akan berfungsi untuk ekstensi

.com.uk
.co.in
.uk.edu.in

Contoh yang tidak akan berhasil:

-stack.com

itu akan bekerja bahkan dengan ekstensi domain terpanjang ".versicherung"

Khan Mengikuti
sumber
0
  • ^((?!-))(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

Danila Kulakov
sumber
0

Regex berikut mengekstrak sub, root, dan tld dari domain tertentu:

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

Diuji untuk domain berikut:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk
landen99
sumber