Ekstrak nama hostname dari string

239

Saya ingin mencocokkan hanya akar URL dan bukan keseluruhan URL dari string teks. Diberikan:

http://www.youtube.com/watch?v=ClkQA2Lb_iE
http://youtu.be/ClkQA2Lb_iE
http://www.example.com/12xy45
http://example.com/random

Saya ingin mendapatkan 2 instance terakhir yang diselesaikan ke domain www.example.comatau example.com.

Saya mendengar regex lambat dan ini akan menjadi ekspresi regex kedua saya di halaman jadi Jika ada cara untuk melakukannya tanpa regex beri tahu saya.

Saya mencari versi JS / jQuery dari solusi ini.

Keluarga
sumber

Jawaban:

281

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!

lewdev
sumber
3
Mungkin lebih baik juga mendukung panjang notasi protokol apa pun. Perbaikan mungkin url.split('/')[2]Sejak terlepas dari kita menulis ftp, ftps, https, nama domain akan selalu berada di indeks 2.
renoirb
1
tergantung pada skenario Anda, Anda mungkin perlu menggunakan return url.split('/')[2] || url.split('/')[0];yang cocok jika tidak ada protokol.
Timmerz
1
Mengapa kalian mengabaikan fakta bahwa fungsi ini akan gagal mengembalikan nama domain untuk beberapa input seperti "ftp.websitename.com/dir/file.txt"?
rineez
1
@renoirb Permisi, bagaimana cara mengikuti pengetikan Bebek?
rineez
6
Satu satu: youtube.com/watch -> www.youtube.com adalah subdomain www dari domain youtube.com. Untuk menghapus www tambahan, saya menambahkan:if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
ra00l
306

Trik yang rapi tanpa menggunakan ekspresi reguler:

var tmp        = document.createElement ('a');
;   tmp.href   = "http://www.example.com/12xy45";

// tmp.hostname will now contain 'www.example.com'
// tmp.host will now contain hostname and port 'www.example.com:80'

Bungkus di atas dalam fungsi seperti di bawah ini dan Anda memiliki cara hebat untuk menyambar bagian domain dari URI.

function url_domain(data) {
  var    a      = document.createElement('a');
         a.href = data;
  return a.hostname;
}
Filip Roséen - ref
sumber
8
sebenarnya saya akan mencoba solusi parseUri tetapi +1 untuk kreativitas.
Chamilyan
11
@Keluarga Saya pikir Anda harus menerima jawaban ini .. ini jauh lebih keren dan bekerja tanpa tambahan apa pun :)
Lipis
3
just fyi - solusi ini tidak menangani nomor port
Kyle
1
@Kyle memang benar, jika Anda menyiratkan bahwa nomor port harus menjadi bagian dari hostname, seharusnya tidak, jika Anda ingin mengakses keduanya hostnamedan port(dan mendapatkannya domain.sample:1234hanya sebagai akses a.host)
Filip Roséen - refp
46
Jangan gunakan ini jika Anda perlu melakukannya dengan cepat . Ini sekitar 40-60 kali lebih lambat daripada metode gilly3. Diuji dalam jsperf: jsperf.com/hostname-from-url .
cprcrack
138

Tidak perlu menguraikan string, cukup berikan URL Anda sebagai argumen untuk URLkonstruktor :

var url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
var hostname = (new URL(url)).hostname;

assert(hostname === 'www.youtube.com');
Pavlo
sumber
6
sama seperti jawaban oleh @mc di bawah ini. Lihat juga komentar "URL baru () tidak berfungsi dengan IE (diuji IE11)".
Keluarga
2
itu mungkin yang paling mudah untuk dikerjakan dengan solusi, jadi +1
Chamilyan
1
Saya menggunakan ini dalam ekstensi chrome, jadi tidak ada dukungan IE yang baik untuk saya saat ini.
Bodine
1
+1 Ini harus menjadi jawaban yang diterima. Ini cepat, dapat diandalkan, bekerja di semua browser modern, tidak bergantung pada pustaka eksternal dan mudah dimengerti (sebagai lawan dari solusi regex). Saya juga berasumsi bahwa ini sangat cepat karena merupakan inti dari apa yang dilakukan oleh setiap browser (bukan karena itu biasanya sangat berarti).
johndodo
128

Coba ini:

var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
var domain = matches && matches[1];  // domain will be null if no match is found

Jika Anda ingin mengecualikan port dari hasil Anda, gunakan ungkapan ini sebagai gantinya:

/^https?\:\/\/([^\/:?#]+)(?:[\/:?#]|$)/i

Sunting: Untuk mencegah pencocokan domain tertentu, gunakan kepala pencarian yang negatif.(?!youtube.com)

/^https?\:\/\/(?!(?:www\.)?(?:youtube\.com|youtu\.be))([^\/:?#]+)(?:[\/:?#]|$)/i
gilly3
sumber
3
Jangan lupa tentang format seperti protokol: // nama pengguna: kata sandi @ host: port / path / ke / sumber daya ...
Andrew White
1
Tutup, tetapi URL mungkin tidak memiliki jalur dan bagian host dapat berakhir pada ?' (query) or # `(fragmen). misalnya http://example.com?var=valatau http://example.com#fragment. Dengan demikian, regex yang benar harus sesuatu seperti: /^https?\:\/\/([^\/?#]+)/. Selain itu, Anda akan mendapatkan +1 saya (ini adalah solusi tercepat)
ridgerunner
2
Anda mungkin ingin menambahkan opsional (?:www\.)?di lookahead negatif.
ridgerunner
3
+1 karena ini sangat cepat, yang merupakan persyaratan dalam kasus saya
cprcrack
8
@FellowStranger - Tambahkan (?:www\.)?ke ekspresi reguler seperti ini:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
gilly3
36

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.

Andrew White
sumber
12
Jangan gunakan ini jika Anda perlu melakukannya dengan cepat . Untuk mendapatkan hostname saja, ini sekitar 40-60 kali lebih lambat daripada metode gilly3. Diuji dalam jsperf: jsperf.com/hostname-from-url .
cprcrack
Berikut URL yang diperbarui (yang lain mengembalikan 404 tidak ditemukan): javascriptoo.com/application/html/js/franzenzenhofer/parseUri/…
ub3rst4r
@BigDong mungkin Anda dapat dengan mudah memerlukan lib? nodejs.org/api/…
mc.
2
Sayangnya URL TIDAK didukung di IE10.
advncd
1
URL()belum didukung sepenuhnya. Periksa: caniuse.com/#feat=url
Kousha
34

Jawaban 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 keterbacaan

Di era Babel, solusi terbersih dan termudah adalah menggunakan URL.hostname.

const getHostname = (url) => {
  // use URL constructor and return hostname
  return new URL(url).hostname;
}

// tests
console.log(getHostname("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostname("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

URL.hostnameadalah 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.hostnamelebih cepat daripada menggunakan solusi jangkar atau parseUri . Namun itu masih jauh lebih lambat daripada regex gilly3 :

const getHostnameFromRegex = (url) => {
  // run against regex
  const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
  // extract hostname (will be null if no match is found)
  return matches && matches[1];
}

// tests
console.log(getHostnameFromRegex("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostnameFromRegex("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

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.hostnameuntuk dibaca.

Robin Métral
sumber
15

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

function parseURL(url){
    parsed_url = {}

    if ( url == null || url.length == 0 )
        return parsed_url;

    protocol_i = url.indexOf('://');
    parsed_url.protocol = url.substr(0,protocol_i);

    remaining_url = url.substr(protocol_i + 3, url.length);
    domain_i = remaining_url.indexOf('/');
    domain_i = domain_i == -1 ? remaining_url.length - 1 : domain_i;
    parsed_url.domain = remaining_url.substr(0, domain_i);
    parsed_url.path = domain_i == -1 || domain_i + 1 == remaining_url.length ? null : remaining_url.substr(domain_i + 1, remaining_url.length);

    domain_parts = parsed_url.domain.split('.');
    switch ( domain_parts.length ){
        case 2:
          parsed_url.subdomain = null;
          parsed_url.host = domain_parts[0];
          parsed_url.tld = domain_parts[1];
          break;
        case 3:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2];
          break;
        case 4:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2] + '.' + domain_parts[3];
          break;
    }

    parsed_url.parent_domain = parsed_url.host + '.' + parsed_url.tld;

    return parsed_url;
}

Menjalankan ini:

parseURL('https://www.facebook.com/100003379429021_356001651189146');

Hasil:

Object {
    domain : "www.facebook.com",
    host : "facebook",
    path : "100003379429021_356001651189146",
    protocol : "https",
    subdomain : "www",
    tld : "com"
}
BlackDivine
sumber
1
Saya biasanya merindukan jawaban suara rendah, tetapi jawaban ini membuat saya waspada. Bagus sekali! Terima kasih @BlackDivine
Devaroop
Terima kasih telah meluangkan waktu untuk menghargai upaya saya @Devaroop
BlackDivine
15

Jika Anda berakhir di halaman ini dan Anda sedang mencari REGEX URL terbaik, cobalah yang ini:

^(?:https?:)?(?:\/\/)?([^\/\?]+)

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

Luis Lopes
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
Lawrence Aiello
1
Diedit dan dikirimkan regex :)
Luis Lopes
6

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

getUrlParts("https://news.google.com/news/headlines/technology.html?ned=us&hl=en")

Keluaran

{
  "origin": "https://news.google.com",
  "domain": "news.google.com",
  "subdomain": "news",
  "domainroot": "google.com",
  "domainpath": "news.google.com/news/headlines",
  "tld": ".com",
  "path": "news/headlines/technology.html",
  "query": "ned=us&hl=en",
  "protocol": "https",
  "port": 443,
  "parts": [
    "news",
    "google",
    "com"
  ],
  "segments": [
    "news",
    "headlines",
    "technology.html"
  ],
  "params": [
    {
      "key": "ned",
      "val": "us"
    },
    {
      "key": "hl",
      "val": "en"
    }
  ]
}

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.

function getUrlParts(fullyQualifiedUrl) {
    var url = {},
        tempProtocol
    var a = document.createElement('a')
    // if doesn't start with something like https:// it's not a url, but try to work around that
    if (fullyQualifiedUrl.indexOf('://') == -1) {
        tempProtocol = 'https://'
        a.href = tempProtocol + fullyQualifiedUrl
    } else
        a.href = fullyQualifiedUrl
    var parts = a.hostname.split('.')
    url.origin = tempProtocol ? "" : a.origin
    url.domain = a.hostname
    url.subdomain = parts[0]
    url.domainroot = ''
    url.domainpath = ''
    url.tld = '.' + parts[parts.length - 1]
    url.path = a.pathname.substring(1)
    url.query = a.search.substr(1)
    url.protocol = tempProtocol ? "" : a.protocol.substr(0, a.protocol.length - 1)
    url.port = tempProtocol ? "" : a.port ? a.port : a.protocol === 'http:' ? 80 : a.protocol === 'https:' ? 443 : a.port
    url.parts = parts
    url.segments = a.pathname === '/' ? [] : a.pathname.split('/').slice(1)
    url.params = url.query === '' ? [] : url.query.split('&')
    for (var j = 0; j < url.params.length; j++) {
        var param = url.params[j];
        var keyval = param.split('=')
        url.params[j] = {
            'key': keyval[0],
            'val': keyval[1]
        }
    }
    // domainroot
    if (parts.length > 2) {
        url.domainroot = parts[parts.length - 2] + '.' + parts[parts.length - 1];
        // check for country code top level domain
        if (parts[parts.length - 1].length == 2 && parts[parts.length - 1].length == 2)
            url.domainroot = parts[parts.length - 3] + '.' + url.domainroot;
    }
    // domainpath (domain+path without filenames) 
    if (url.segments.length > 0) {
        var lastSegment = url.segments[url.segments.length - 1]
        var endsWithFile = lastSegment.indexOf('.') != -1
        if (endsWithFile) {
            var fileSegment = url.path.indexOf(lastSegment)
            var pathNoFile = url.path.substr(0, fileSegment - 1)
            url.domainpath = url.domain
            if (pathNoFile)
                url.domainpath = url.domainpath + '/' + pathNoFile
        } else
            url.domainpath = url.domain + '/' + url.path
    } else
        url.domainpath = url.domain
    return url
}
Whitneyland
sumber
gagal pada beberapa penguraian yang cukup sederhana. Coba getUrlParts('www.google.com')di konsol di halaman ini.
Chamilyan
@ Keluarga Itu bukan url, url punya protokol. Namun saya telah memperbarui kode untuk menangani kasus yang lebih umum, jadi harap ambil kembali downvote Anda.
whitneyland
Saya tidak memilih Anda. Tetapi saya akan melakukannya jika saya tidak secara spesifik meminta http: // dalam pertanyaan awal saya.
Chamilyan
2
@Lee gagal di input ini: var url="https://mail.gggg.google.cn/link/link/link";yang domainrootharus google.comtetapi output: gggg.google.cnsementara ggggadalah sub-domain (domain dapat memiliki beberapa sub-domain).
Tidak ada
4

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:

hostname = "http://www.example.com:1234"
hostname.split ("//"). slice (-1) [0] .split (":") [0] .split ('.'). slice (-2) .join ('.') // memberikan "example.com"

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":

"http://example.com" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). slice (-2). Ikuti('.')
"http://example.com:1234".split("//").slice(-1)[0[.split(":")[0[.split('.').slice(-2 ).Ikuti('.')
"http://www.example.com:1234" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). slice ( -2) .join ('.')
"http://foo.www.example.com:1234" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). slice (-2) .join ('.')
zaphodb
sumber
bagus karena menangani kasus di mana www tidak relevan
Chamilyan
4

Inilah jQuery one-liner:

$('<a>').attr('href', url).prop('hostname');
gradosevic
sumber
3
String.prototype.trim = function(){return his.replace(/^\s+|\s+$/g,"");}
function getHost(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    var _host,_arr;
    if(-1<url.indexOf("://")){
        _arr = url.split('://');
        if(-1<_arr[0].indexOf("/")||-1<_arr[0].indexOf(".")||-1<_arr[0].indexOf("\?")||-1<_arr[0].indexOf("\&")){
            _arr[0] = _arr[0].trim();
            if(0==_arr[0].indexOf("//")) _host = _arr[0].split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
            else return "";
        }
        else{
            _arr[1] = _arr[1].trim();
            _host = _arr[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        }
    }
    else{
        if(0==url.indexOf("//")) _host = url.split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        else return "";
    }
    return _host;
}
function getHostname(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHost(url).split(':')[0];
}
function getDomain(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHostname(url).replace(/([a-zA-Z0-9]+.)/,"");
}
QazyCat
sumber
jadi saya menambahkan komentar di sini: Kode itu berfungsi bahkan dengan url yang dimulai dari // atau memiliki kesalahan sintaksis seperti qqq.qqq.qqq & test = 2 atau memiliki param kueri dengan URL seperti? param = www.www
QazyCat
3
function hostname(url) {
    var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i);
    if ( match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0 ) return match[2];
}

Kode di atas akan berhasil mengurai nama host untuk url contoh berikut:

http://WWW.first.com/folder/page.html first.com

http://mail.google.com/folder/page.html mail.google.com

https://mail.google.com/folder/page.html mail.google.com

http://www2.somewhere.com/folder/page.html?q=1 somewhere.com

https://www.another.eu/folder/page.html?q=1 another.eu

Kredit asli diberikan kepada: http://www.primaryobjects.com/CMS/Article145

jaggedsoft
sumber
3

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.

function getDomain(url) {
    var dom = "", v, step = 0;
    for(var i=0,l=url.length; i<l; i++) {
        v = url[i]; if(step == 0) {
            //First, skip 0 to 5 characters ending in ':' (ex: 'https://')
            if(i > 5) { i=-1; step=1; } else if(v == ':') { i+=2; step=1; }
        } else if(step == 1) {
            //Skip 0 or 4 characters 'www.'
            //(Note: Doesn't work with www.com, but that domain isn't claimed anyway.)
            if(v == 'w' && url[i+1] == 'w' && url[i+2] == 'w' && url[i+3] == '.') i+=4;
            dom+=url[i]; step=2;
        } else if(step == 2) {
            //Stop at subpages, queries, and hashes.
            if(v == '/' || v == '?' || v == '#') break; dom += v;
        }
    }
    return dom;
}
Pecacheu
sumber
3

Ini bukan jawaban lengkap, tetapi kode di bawah ini akan membantu Anda:

function myFunction() {
    var str = "https://www.123rf.com/photo_10965738_lots-oop.html";
    matches = str.split('/');
    return matches[2];
}

Saya ingin seseorang membuat kode lebih cepat dari saya. Ini membantu meningkatkan diri saya juga.

solokiran
sumber
3

oneline dengan jquery

$('<a>').attr('href', document.location.href).prop('hostname');
VnDevil
sumber
2
// use this if you know you have a subdomain
// www.domain.com -> domain.com
function getDomain() {
  return window.location.hostname.replace(/([a-zA-Z0-9]+.)/,"");
}
Gubatron
sumber
2

Saya pribadi banyak meneliti untuk solusi ini, dan yang terbaik yang bisa saya temukan sebenarnya dari "browser check" CloudFlare:

function getHostname(){  
            secretDiv = document.createElement('div');
            secretDiv.innerHTML = "<a href='/'>x</a>";
            secretDiv = secretDiv.firstChild.href;
            var HasHTTPS = secretDiv.match(/https?:\/\//)[0];
            secretDiv = secretDiv.substr(HasHTTPS.length);
            secretDiv = secretDiv.substr(0, secretDiv.length - 1);
            return(secretDiv);  
}  

getHostname();

Saya menulis ulang variabel sehingga lebih "manusia" dapat dibaca, tetapi melakukan pekerjaan lebih baik dari yang diharapkan.

Norbert Boros
sumber
2

Nah, melakukan menggunakan ekspresi reguler akan jauh lebih mudah:

    mainUrl = "http://www.mywebsite.com/mypath/to/folder";
    urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(mainUrl);
    host = Fragment[1]; // www.mywebsite.com
Saurabh Mandeel
sumber
2
import URL from 'url';

const pathname = URL.parse(url).path;
console.log(url.replace(pathname, ''));

ini menangani kedua protokol.

stanley oguazu
sumber
Memang modul ini dilengkapi dengan NodeJS.
djibe
1

singkatnya Anda bisa melakukan ini

var url = "http://www.someurl.com/support/feature"

function getDomain(url){
  domain=url.split("//")[1];
  return domain.split("/")[0];
}
eg:
  getDomain("http://www.example.com/page/1")

  output:
   "www.example.com"

Gunakan fungsi di atas untuk mendapatkan nama domain

uzaif
sumber
apa masalahnya?
uzaif
masalahnya adalah itu tidak akan berfungsi jika tidak ada garis miring sebelumnya?
Toolkit
dalam kasus Anda, Anda perlu memeriksa ?string nama domain Anda dan alih-alih return domain.split("/")[0]; menaruh return domain.split("?")[0];harapan ini berfungsi
uzaif
0

Kode:

var regex = /\w+.(com|co\.kr|be)/ig;
var urls = ['http://www.youtube.com/watch?v=ClkQA2Lb_iE',
            'http://youtu.be/ClkQA2Lb_iE',
            'http://www.example.com/12xy45',
            'http://example.com/random'];


$.each(urls, function(index, url) {
    var convertedUrl = url.match(regex);
    console.log(convertedUrl);
});

Hasil:

youtube.com
youtu.be
example.com
example.com
Yeongjun Kim
sumber
@ChristianTernus Sebaliknya; OP menyebutkan regex, dan ini cukup jelas ekspresi regex yang dirancang agar sesuai dengan bagian yang diminta dari URL. Itu tidak sepenuhnya benar (misalnya memerlukan www.meskipun tidak semua URL memiliki komponen ini), tetapi tentu saja ini merupakan jawaban .
Kyle Strand
@KyleStrand Pretty jelas merupakan penilaian subyektif; memberikan regex mentah ketika ditanya "Saya mencari versi JS / jQuery dari solusi ini" tidak menjawab pertanyaan tersebut.
Christian Ternus
Saya OP. Saya adalah pengembang baru pada saat itu mencari solusi di luar kotak di JS. Memang, string regex mentah tanpa konteks apa pun tidak akan membantu sama sekali. Plus itu tidak lengkap.
Chamilyan
0

parse-domain - perpustakaan ringan yang sangat solid

npm install parse-domain

const { fromUrl, parseDomain } = require("parse-domain");

Contoh 1

parseDomain(fromUrl("http://www.example.com/12xy45"))
{ type: 'LISTED',
  hostname: 'www.example.com',
  labels: [ 'www', 'example', 'com' ],
  icann:
   { subDomains: [ 'www' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'www' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

Contoh 2

parseDomain(fromUrl("http://subsub.sub.test.ExAmPlE.coM/12xy45"))
{ type: 'LISTED',
  hostname: 'subsub.sub.test.example.com',
  labels: [ 'subsub', 'sub', 'test', 'example', 'com' ],
  icann:
   { subDomains: [ 'subsub', 'sub', 'test' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'subsub', 'sub', 'test' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

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.

Glen Thompson
sumber
Ini mungkin masalah lingkungan / versi melihat pada npmjs.com/package/parse-domain
Glen Thompson
-1

Kode saya terlihat seperti ini. Ekspresi reguler dapat datang dalam berbagai bentuk, dan ini adalah kasus pengujian saya, saya pikir itu lebih skalabel.

function extractUrlInfo(url){
  let reg = /^((?<protocol>http[s]?):\/\/)?(?<host>((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])|[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)))(\:(?<port>[0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/
  return reg.exec(url).groups
}

var url = "https://192.168.1.1:1234"
console.log(extractUrlInfo(url))
var url = "/programming/8498592/extract-hostname-name-from-string"
console.log(extractUrlInfo(url))

gao.xiangyang
sumber
-6

Coba kode di bawah ini untuk nama domain yang tepat menggunakan regex,

String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";

  String pattern3="([\\w\\W]\\.)+(.*)?(\\.[\\w]+)";

  Pattern r = Pattern.compile(pattern3);


  Matcher m = r.matcher(line);
  if (m.find( )) {

    System.out.println("Found value: " + m.group(2) );
  } else {
     System.out.println("NO MATCH");
  }
I_Tech
sumber
2
OP sedang mencari jawaban dalam JavaScript, bukan Java.
piersadrian