Saya sarankan menggunakan paket npm psl (Public Suffix List) . "Daftar Sufiks Publik" adalah daftar semua sufiks dan aturan domain yang valid, bukan hanya domain Tingkat Atas Kode Negara, tetapi juga karakter unicode yang akan dianggap sebagai domain root (yaitu www. 食 狮. 公司 .cn, bckobe .jp, dll.). Baca lebih lanjut di sini .
Mencoba:
npm install --save psl
Kemudian dengan menjalankan implementasi "extractHostname" saya:
let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com
Saya tidak dapat menggunakan paket npm, jadi di bawah ini hanya menguji extractHostname.
function extractHostname(url) {
var hostname;
//find & remove protocol (http, ftp, etc.) and get hostname
if (url.indexOf("//") > -1) {
hostname = url.split('/')[2];
}
else {
hostname = url.split('/')[0];
}
//find & remove port number
hostname = hostname.split(':')[0];
//find & remove "?"
hostname = hostname.split('?')[0];
return hostname;
}
//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));
Terlepas dari memiliki protokol atau nomor port, Anda dapat mengekstrak domain. Ini adalah solusi non-regex yang sangat sederhana, jadi saya pikir ini akan berhasil.
* Terima kasih @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson atas saran Anda! @ ross-allen, terima kasih telah melaporkan bug!
url.split('/')[2]
Sejak terlepas dari kita menulisftp
,ftps
,https
, nama domain akan selalu berada di indeks 2.return url.split('/')[2] || url.split('/')[0];
yang cocok jika tidak ada protokol.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Trik yang rapi tanpa menggunakan ekspresi reguler:
Bungkus di atas dalam fungsi seperti di bawah ini dan Anda memiliki cara hebat untuk menyambar bagian domain dari URI.
sumber
hostname
, seharusnya tidak, jika Anda ingin mengakses keduanyahostname
danport
(dan mendapatkannyadomain.sample:1234
hanya sebagai aksesa.host
)Tidak perlu menguraikan string, cukup berikan URL Anda sebagai argumen untuk
URL
konstruktor :sumber
Coba ini:
Jika Anda ingin mengecualikan port dari hasil Anda, gunakan ungkapan ini sebagai gantinya:
Sunting: Untuk mencegah pencocokan domain tertentu, gunakan kepala pencarian yang negatif.
(?!youtube.com)
sumber
?' (query) or
# `(fragmen). misalnyahttp://example.com?var=val
atauhttp://example.com#fragment
. Dengan demikian, regex yang benar harus sesuatu seperti:/^https?\:\/\/([^\/?#]+)/
. Selain itu, Anda akan mendapatkan +1 saya (ini adalah solusi tercepat)(?:www\.)?
di lookahead negatif.(?:www\.)?
ke ekspresi reguler seperti ini:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
Mem-parsing URL bisa rumit karena Anda dapat memiliki nomor port dan karakter khusus. Karena itu, saya sarankan menggunakan sesuatu seperti parseUri untuk melakukan ini untuk Anda. Saya ragu kinerja akan menjadi masalah kecuali Anda menguraikan ratusan URL.
sumber
URL()
belum didukung sepenuhnya. Periksa: caniuse.com/#feat=urlJawaban 2020
Anda tidak memerlukan dependensi tambahan untuk ini! Tergantung pada apakah Anda perlu mengoptimalkan kinerja atau tidak, ada dua solusi bagus:
Menggunakan
URL.hostname
untuk keterbacaanDi era Babel, solusi terbersih dan termudah adalah menggunakan
URL.hostname
.URL.hostname
adalah bagian dari API URL , didukung oleh semua browser utama kecuali IE ( caniuse ). Gunakan polyfill URL jika Anda perlu mendukung browser lawas.Menggunakan solusi ini juga akan memberi Anda akses ke properti dan metode URL lainnya . Ini akan berguna jika Anda juga ingin mengekstrak pathname URL atau params string kueri , misalnya.
Gunakan RegEx untuk kinerja
URL.hostname
lebih cepat daripada menggunakan solusi jangkar atau parseUri . Namun itu masih jauh lebih lambat daripada regex gilly3 :Uji sendiri di jsPerf ini
Jika Anda perlu memproses sejumlah besar URL (yang kinerjanya menjadi faktor), saya sarankan menggunakan solusi ini sebagai gantinya. Jika tidak, pilih
URL.hostname
untuk dibaca.sumber
Saya mencoba menggunakan solusi yang Diberikan, yang Terpilih adalah kerja keras untuk tujuan saya dan "Membuat elemen" yang kacau untuk saya.
Ini belum siap untuk Port in URL. Saya harap seseorang menemukannya bermanfaat
Menjalankan ini:
Hasil:
sumber
Jika Anda berakhir di halaman ini dan Anda sedang mencari REGEX URL terbaik, cobalah yang ini:
https://regex101.com/r/pX5dL9/1
Ini berfungsi untuk url tanpa http: //, dengan http, dengan https, hanya // dan jangan ambil jalur dan jalur kueri juga.
Semoga berhasil
sumber
Semua properti url, tidak ada dependensi, tidak ada JQuery, mudah dimengerti
Solusi ini memberikan jawaban Anda plus properti tambahan. Tidak diperlukan JQuery atau dependensi lain, tempel dan buka.
Pemakaian
Keluaran
Kode
Kode ini dirancang agar mudah dipahami daripada super cepat. Itu dapat dipanggil dengan mudah 100 kali per detik, jadi itu bagus untuk front end atau beberapa penggunaan server, tetapi tidak untuk throughput volume tinggi.
sumber
getUrlParts('www.google.com')
di konsol di halaman ini.var url="https://mail.gggg.google.cn/link/link/link";
yangdomainroot
harusgoogle.com
tetapi output:gggg.google.cn
sementaragggg
adalah sub-domain (domain dapat memiliki beberapa sub-domain).Cukup gunakan URL () konstruktor :
sumber
Sedang mencari solusi untuk masalah ini hari ini. Tidak ada jawaban di atas yang memuaskan. Saya ingin solusi yang bisa menjadi satu liner, tidak ada logika kondisional dan tidak ada yang harus dibungkus dalam suatu fungsi.
Inilah yang saya buat, tampaknya bekerja dengan sangat baik:
Sekilas mungkin terlihat rumit, tetapi bekerja cukup sederhana; kuncinya adalah menggunakan 'slice (-n)' di beberapa tempat di mana bagian yang baik harus ditarik dari ujung array split (dan [0] untuk mendapatkan dari depan array split).
Masing-masing tes ini mengembalikan "example.com":
sumber
Inilah jQuery one-liner:
sumber
sumber
Kredit asli diberikan kepada: http://www.primaryobjects.com/CMS/Article145
sumber
Oke, saya tahu ini adalah pertanyaan lama, tapi saya membuat parser url yang sangat efisien jadi saya pikir saya akan membagikannya.
Seperti yang Anda lihat, struktur fungsinya sangat aneh, tetapi untuk efisiensi. Tidak ada fungsi prototipe yang digunakan, string tidak mendapatkan iterasi lebih dari sekali, dan tidak ada karakter yang diproses lebih dari yang diperlukan.
sumber
Ini bukan jawaban lengkap, tetapi kode di bawah ini akan membantu Anda:
Saya ingin seseorang membuat kode lebih cepat dari saya. Ini membantu meningkatkan diri saya juga.
sumber
oneline dengan jquery
sumber
sumber
Saya pribadi banyak meneliti untuk solusi ini, dan yang terbaik yang bisa saya temukan sebenarnya dari "browser check" CloudFlare:
Saya menulis ulang variabel sehingga lebih "manusia" dapat dibaca, tetapi melakukan pekerjaan lebih baik dari yang diharapkan.
sumber
Nah, melakukan menggunakan ekspresi reguler akan jauh lebih mudah:
sumber
ini menangani kedua protokol.
sumber
singkatnya Anda bisa melakukan ini
Gunakan fungsi di atas untuk mendapatkan nama domain
sumber
?
string nama domain Anda dan alih-alihreturn domain.split("/")[0];
menaruhreturn domain.split("?")[0];
harapan ini berfungsiParse-Url tampaknya merupakan perpustakaan JavaScript dengan pola paling kuat
Berikut ini adalah daftar fitur:
Bab 1. Normalisasi atau parsing satu URL
Bab 2. Ekstrak semua URL
Bagian 3. Ekstrak URI dengan nama tertentu
Bab 4. Ekstrak semua URL fuzzy
Bab 5. Sorot semua URL dalam teks
Bab 6. Ekstrak semua URL dalam HTML mentah atau XML
sumber
Kode:
Hasil:
sumber
www.
meskipun tidak semua URL memiliki komponen ini), tetapi tentu saja ini merupakan jawaban .parse-domain - perpustakaan ringan yang sangat solid
npm install parse-domain
Contoh 1
Contoh 2
Mengapa?
Bergantung pada use case dan volume, saya sangat menyarankan untuk tidak memecahkan masalah ini sendiri menggunakan regex atau cara manipulasi string lainnya. Inti dari masalah ini adalah bahwa Anda perlu mengetahui semua sufiks gtld dan cctld untuk mengurai string url dengan benar ke dalam domain dan subdomain, sufiks ini diperbarui secara berkala. Ini adalah masalah yang dipecahkan dan bukan yang ingin Anda selesaikan sendiri (kecuali jika Anda adalah google atau sesuatu). Kecuali Anda memerlukan nama host atau nama domain dalam keadaan darurat, jangan mencoba dan menguraikan jalan keluar dari yang ini.
sumber
Kode saya terlihat seperti ini. Ekspresi reguler dapat datang dalam berbagai bentuk, dan ini adalah kasus pengujian saya, saya pikir itu lebih skalabel.
sumber
Coba kode di bawah ini untuk nama domain yang tepat menggunakan regex,
String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";
sumber