Diberikan URL, saya ingin mengekstrak nama domain (Seharusnya tidak termasuk bagian 'www'). Url dapat berisi http / https. Berikut adalah kode java yang saya tulis. Meskipun tampaknya berfungsi dengan baik, apakah ada pendekatan yang lebih baik atau ada beberapa kasus tepi, yang bisa gagal.
public static String getDomainName(String url) throws MalformedURLException{
if(!url.startsWith("http") && !url.startsWith("https")){
url = "http://" + url;
}
URL netUrl = new URL(url);
String host = netUrl.getHost();
if(host.startsWith("www")){
host = host.substring("www".length()+1);
}
return host;
}
Input: http://google.com/blah
Output: google.com
http://74.125.226.70
dan beri tahu saya cara kerjanya :)http://www.de/
atauhttp://www.com/
tidak akan memberikan hasil yang diinginkan.Jawaban:
Jika Anda ingin menguraikan URL, gunakan
java.net.URI
.java.net.URL
memiliki banyak masalah -equals
metodenya melakukan pencarian DNS yang berarti kode yang menggunakannya dapat rentan terhadap serangan penolakan layanan ketika digunakan dengan input yang tidak dipercaya."Mr. Gosling - mengapa Anda membuat url sama dengan mengisap?" menjelaskan satu masalah seperti itu. Biasakan menggunakan saja
java.net.URI
sebagai gantinya.harus melakukan apa yang Anda inginkan.
Kode Anda sebagai tulisan gagal untuk URL yang valid:
httpfoo/bar
- URL relatif dengan komponen jalur yang dimulai denganhttp
.HTTP://example.com/
- protokol tidak peka huruf besar-kecil.//example.com/
- protokol URL relatif dengan hostwww/foo
- URL relatif dengan komponen jalur yang dimulai denganwww
wwwexample.com
- nama domain yang tidak dimulai denganwww.
tetapi dimulai denganwww
.URL hierarkis memiliki tata bahasa yang kompleks. Jika Anda mencoba untuk menggulung parser Anda sendiri tanpa membaca RFC 3986 dengan hati-hati, Anda mungkin salah. Cukup gunakan yang dibangun ke perpustakaan inti.
Jika Anda benar-benar harus berurusan dengan input berantakan yang
java.net.URI
menolak, lihat RFC 3986 Lampiran B:sumber
www.google.com
adalah URL relatif dengan komponen jalur ituwww.google.com
. Misalnya, jika diselesaikanhttp://example.com/
, Anda akan mendapatkannyahttp://example.com/www.google.com
.Baca lebih lajut
sumber
Berikut ini adalah garis pendek dan sederhana yang digunakan
InternetDomainName.topPrivateDomain()
di Jambu:InternetDomainName.from(new URL(url).getHost()).topPrivateDomain().toString()
Mengingat
http://www.google.com/blah
, itu akan memberi Andagoogle.com
. Atau, mengingathttp://www.google.co.mx
, itu akan memberi Andagoogle.co.mx
.Seperti Sa Qada berkomentar dalam jawaban lain pada posting ini, pertanyaan ini telah ditanyakan sebelumnya: Ekstrak nama domain utama dari url yang diberikan . The jawaban terbaik untuk pertanyaan itu adalah dari Satya , yang menyarankan Guava ini InternetDomainName.topPrivateDomain ()
Menyatukannya dengan
URL.getHost()
, yang sudah berisi pos asli, memberi Anda:sumber
Saya menulis sebuah metode (lihat di bawah) yang mengekstrak nama domain url dan yang menggunakan pencocokan String sederhana. Apa yang sebenarnya dilakukannya adalah mengekstrak bit antara yang pertama
"://"
(atau indeks0
jika tidak ada yang"://"
terkandung) dan yang berikutnya berikutnya"/"
(atau indeksString.length()
jika tidak ada yang berikutnya"/"
). Yang tersisa, sebelumnya"www(_)*."
Bit yang dipotong. Saya yakin akan ada kasus di mana ini tidak akan cukup baik tetapi harus cukup baik dalam banyak kasus!Posting Mike Samuel di atas mengatakan bahwa
java.net.URI
kelas dapat melakukan ini (dan lebih disukai daripadajava.net.URL
kelas) tetapi saya mengalami masalah denganURI
kelas. Khususnya,URI.getHost()
memberikan nilai nol jika url tidak termasuk skema, yaitu"http(s)"
bit.sumber
http://bob.com:8080/service/read?name=robert
Saya melakukan perawatan kecil setelah pembuatan objek URI
sumber
Dalam kasus saya, saya hanya perlu domain utama dan bukan subdomain (tidak ada "www" atau apa pun subdomain itu):
Dengan metode ini url " https://rest.webtoapp.io/llSlider?lg=en&t=8 " akan memiliki untuk domain "webtoapp.io".
sumber
coba yang ini: java.net.URL;
JOptionPane.showMessageDialog (null, getDomainName (URL baru (" https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains "))));
sumber
Ada pertanyaan serupa Ekstrak nama domain utama dari url yang diberikan . Jika Anda melihat jawaban ini , Anda akan melihat bahwa itu sangat mudah. Anda hanya perlu menggunakan
java.net.URL
danString
utilitas -Split
sumber
Penjelasan: Regex memiliki 4 grup. Dua yang pertama adalah grup yang tidak cocok dan dua yang berikutnya adalah grup yang cocok.
Grup tidak cocok pertama adalah "http" atau "https" atau ""
Grup tidak cocok kedua adalah "www." atau ""
Grup pencocokan kedua adalah domain tingkat atas
Grup pencocokan pertama adalah apa saja setelah grup yang tidak cocok dan apa pun sebelum domain tingkat atas
Rangkuman dari dua grup yang cocok akan memberi kita nama domain / host.
PS: Perhatikan bahwa Anda dapat menambahkan sejumlah domain yang didukung ke regex.
sumber
Jika url input adalah input pengguna. metode ini memberikan nama host yang paling tepat. jika tidak ditemukan berikan kembali url input.
sumber
Semua hal di atas baik. Yang ini sepertinya sangat sederhana bagi saya dan mudah dimengerti. Maafkan kutipan. Saya menulisnya untuk Groovy di dalam kelas yang disebut DataCenter.
Dan inilah beberapa tes junit4:
sumber
Salah satu cara yang saya lakukan dan bekerja untuk semua kasus adalah menggunakan Perpustakaan Guava dan regex dalam kombinasi.
getDomain () dapat berupa metode umum dengan regex.
sumber
Untuk mendapatkan nama domain yang sebenarnya, tanpa subdomain, saya menggunakan:
Perhatikan bahwa ini tidak akan berfungsi dengan domain tingkat kedua (seperti .co.uk).
sumber