从字符串中提取主机名


239

我想只匹配URL的根,而不匹配文本字符串中的整个URL。鉴于:

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

我想将最后2个实例解析为www.example.comexample.com域。

我听说正则表达式很慢,这将是我在页面上的第二个正则表达式表达式,因此,如果仍然需要不使用正则表达式,请告诉我。

我正在寻找此解决方案的JS / jQuery版本。

Answers:


281

我建议使用npm软件包psl(公共后缀列表)。“公共后缀列表”是所有有效域后缀和规则的列表,不仅包括国家/地区代码顶级域,还包括将被视为根域的unicode字符(即www。食狮。公司.cn,bckobe .jp等)。在此处了解更多信息。

尝试:

npm install --save psl

然后使用我的“ extractHostname”实现运行:

let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com

我不能使用npm软件包,因此下面仅测试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"));

无论是否具有协议甚至端口号,都可以提取域。这是一个非常简化的非正则表达式解决方案,所以我认为这可以做到。

*感谢@ Timmerz,@ renoirb,@ rineez,@ BigDong,@ ra00l,@ ILikeBeansTacos,@ CharlesRobertson!@ ross-allen,感谢您报告错误!


3
也支持任何协议符号长度可能会更好。的改进可能是url.split('/')[2]因为无论我们写ftpftpshttps,域名将永远在索引2
renoirb

1
根据您的方案return url.split('/')[2] || url.split('/')[0];,如果没有协议,您可能需要使用哪个匹配项。
Timmerz 2014年

1
你们为什么忽略这个功能将无法为“ ftp.websitename.com/dir/file.txt”之类的输入返回域名的事实?
rineez 2014年

1
@renoirb对不起,这是Duck打字的结果吗?
rineez 2014年

6
一个:youtube.com/watch- > www.youtube.com是youtube.com域的www子域。为了删除多余的www,我添加了:if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
ra00l

306

一个不使用正则表达式的巧妙技巧:

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'

将上面的内容包装在下面的功能中,您将拥有一种从URI中抢夺域部分的绝妙方式。

function url_domain(data) {
  var    a      = document.createElement('a');
         a.href = data;
  return a.hostname;
}

8
实际上,我将尝试parseUri解决方案,但为创造力+1。
Chamilyan 2011年

11
@Chamilyan我认为您应该接受这个答案..它凉爽得多,无需任何额外的操作即可:)
Lipis 2012年

3
只是fyi-此解决方案无法处理端口号
Kyle

1
如果您要暗示端口号应该是的一部分,则@Kyle确实可以hostname,如果您要同时访问hostnameport(并使其作为domain.sample:1234access a.host
则不

46
如果您需要快速执行此操作,请不要使用它。它比gilly3的方法慢40-60倍。在jsperf中测试:jsperf.com/hostname-from-url
cprcrack

138

无需解析字符串,只需将您的URL作为参数传递给URL构造函数

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

assert(hostname === 'www.youtube.com');

6
与下面@mc的答案相同。还可以查看注释“新的URL()不适用于IE(经过测试的IE11)”。
Chamilyan '16

2
但它可能是最容易使用的解决方案,因此+1
Chamilyan

1
我在chrome扩展程序中使用了此功能,因此目前尚无IE支持。
bodine

1
+1这应该是公认的答案。它快速,可靠,可在所有现代浏览器中运行,不依赖外部库且易于理解(与regex解决方案相对)。我还假设它是非常快的,因为它是每个浏览器的核心功能(尽管通常它并不重要)。
johndodo

128

试试这个:

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

如果要从结果中排除端口,请改用以下表达式:

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

编辑:为防止特定域匹配,请使用否定的超前方式。(?!youtube.com)

/^https?\:\/\/(?!(?:www\.)?(?:youtube\.com|youtu\.be))([^\/:?#]+)(?:[\/:?#]|$)/i

3
不要忘记格式,如协议://用户名:密码@主机:端口/路径/到/资源...
安德鲁·怀特

1
关闭,但URL可能没有路径,并且主机部分可以以?' (query) or #`(片段)结尾。例如http://example.com?var=valhttp://example.com#fragment。因此,正确的正则表达式应类似于:/^https?\:\/\/([^\/?#]+)/。除此之外,您还会得到我的+1(这是最快的解决方案)
ridgerunner 2011年

2
您可能希望(?:www\.)?在否定前瞻中添加一个可选项。
ridgerunner 2011年

3
+1是因为它非常快,这对我来说是必须的
cprcrack

8
@FellowStranger-添加(?:www\.)?到这样的正则表达式:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
gilly3

36

解析URL可能很棘手,因为您可以具有端口号和特殊字符。因此,我建议您使用诸如parseUri之类的方法来执行此操作。我怀疑除非您解析数百个URL,否则性能是否会成为问题。


12
如果您需要快速执行此操作,请不要使用它。仅获取主机名,它比gilly3的方法慢40-60倍。在jsperf中测试:jsperf.com/hostname-from-url
cprcrack

下面是一个更新的URL(另一种回报404未找到):javascriptoo.com/application/html/js/franzenzenhofer/parseUri/...
ub3rst4r

@BigDong也许您可以轻松要求lib?nodejs.org/api/...
MC。

2
不幸的是,IE10不支持URL。
advncd 2015年

1
URL()尚不完全支持。检查:caniuse.com/#feat=url
Kousha)

33

2020年答案

您不需要任何额外的依赖!根据是否需要优化性能,有两种好的解决方案:

URL.hostname的可读性

在Babel时代,最干净,最简单的解决方案是使用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.hostnameURL API的一部分,除IE(caniuse)之外,所有主流浏览器都支持。使用网址polyfill如果需要支持旧版浏览器,。

使用此解决方案还将使您能够访问其他URL属性和方法。例如,如果您还想提取URL的路径名查询字符串参数,这将很有用。


使用RegEx提高性能

URL.hostname比使用锚点解决方案parseUri更快。但是它仍然比gilly3的regex慢很多:

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"));

在这个jsPerf上自己测试

如果您需要处理大量的URL(其中性能是一个重要因素),建议您改用此解决方案。否则,请选择URL.hostname可读性。


15

我尝试使用给出的解决方案,选择的解决方案对我而言是一个过大的选择,而“创建元素”则对我来说很混乱。

尚未准备好在URL中使用端口。我希望有人觉得它有用

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;
}

运行此:

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

结果:

Object {
    domain : "www.facebook.com",
    host : "facebook",
    path : "100003379429021_356001651189146",
    protocol : "https",
    subdomain : "www",
    tld : "com"
}

1
我通常会错过投票率偏低的答案,但是这个答案让我很谨慎。很棒!感谢@BlackDivine
Devaroop 2015年

感谢您抽出宝贵时间感谢我的努力@Devaroop
BlackDivine

15

如果您最后进入此页面,并且正在寻找URL的最佳REGEX,请尝试以下一种方法:

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

https://regex101.com/r/pX5dL9/1

它适用于不带http://,带有http,带https,仅带//的URL,并且也不要获取路径和查询路径。

祝好运


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 评论
劳伦斯·艾洛2015年

1
编辑并提交了正则表达式:)
路易斯·洛佩斯

6

所有url属性,无依赖项,无JQuery,易于理解

该解决方案为您提供了答案以及其他属性。无需JQuery或其他依赖项,只需粘贴即可。

用法

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

输出量

{
  "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"
    }
  ]
}

代码
代码被设计为易于理解而不是超快速。每秒可以轻松地调用100次,因此非常适合前端或少量服务器使用,但不适用于高吞吐量。

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
}

在一些非常简单的解析中失败。getUrlParts('www.google.com')在此页面上的控制台中尝试。
Chamilyan '17

@Chamilyan这不是URL,URL具有协议。但是,我已经更新了代码以处理更常见的情况,因此请取回您的赞成票。
whitneyland

我没有对你投反对票。但是如果我在最初的问题中没有特别要求http://,我就会有。
Chamilyan

2
@Lee失败在该输入:var url="https://mail.gggg.google.cn/link/link/link";所述domainrootgoogle.com但它输出:gggg.google.cngggg是一个子域(域可具有多个子域)。


4

今天正在寻找解决此问题的方法。以上答案似乎都不令人满意。我想要的解决方案可以是一个衬套,没有条件逻辑,也不需要封装在函数中。

这是我想出的,似乎工作得很好:

hostname =“ http://www.example.com:1234”
hostname.split(“ //”)。slice(-1)[0] .split(“:”)[0] .split('。')。slice(-2).join('。')//给出“ example.com”

乍一看可能看起来很复杂,但是却很简单。关键是在很多地方都必须使用'slice(-n)',好部分必须从分割数组的末端拉出([0]从分割数组的前端得到)。

这些测试均返回“ example.com”:

“ http://example.com” .split(“ //”).slice(-1)[0] .split(“:”)[0] .split('。')。slice(-2)。加入('。')
“ http://example.com:1234".split("//").slice(-1)[0].split(":")[0].split('.').slice(-2 )。加入('。')
“ 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('。')

不错,因为它可以处理与www不相关的情况
Chamilyan


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]+.)/,"");
}

因此,我在这里添加注释:该代码甚至适用于以//开头的网址,或者存在语法错误(如qqq.qqq.qqq&test = 2)或具有URL的查询参数,如?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];
}

上面的代码将成功解析以下示例URL的主机名:

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 someone.com

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

原始资源归功于:http : //www.primaryobjects.com/CMS/Article145


3

好的,我知道这是一个老问题,但是我做了一个超高效的URL解析器,所以我想与大家分享。

如您所见,函数的结构非常奇怪,但这是为了提高效率。没有使用原型函数,字符串不会被重复多次,并且没有对字符进行过多的处理。

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;
}

3

这不是一个完整的答案,但是下面的代码应该可以帮助您:

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

我希望有人比我更快地创建代码。它也有助于改善自我。


3

单行与jQuery

$('<a>').attr('href', document.location.href).prop('hostname');

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]+.)/,"");
}

2

我为此解决方案进行了很多研究,而我能找到的最好的解决方案实际上是从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();

我重写了变量,使它更具“人类”可读性,但它的工作比预期的要好。


2

好吧,使用正则表达式会容易得多:

    mainUrl = "http://www.mywebsite.com/mypath/to/folder";
    urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(mainUrl);
    host = Fragment[1]; // www.mywebsite.com


1

总之,你可以这样做

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"

使用以上功能获取域名


有什么问题
uzaif

问题是,如果之前没有斜杠,它将不起作用?
工具包

在您的情况下,您需要检查?您的域名字符串,而不是return domain.split("/")[0]; 把这个return domain.split("?")[0];希望它的工作
uzaif


0

码:

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);
});

结果:

youtube.com
youtu.be
example.com
example.com

@ChristianTernus相反;OP提到了正则表达式,这显然是一个正则表达式,旨在匹配URL的请求部分。这不是完全正确的(例如,www.即使并非所有URL都具有此组件,也需要这样做),但这肯定是一个答案
凯尔·斯特兰德

@KyleStrand 漂亮显然是一种主观判断;当被问到“我正在寻找此解决方案的JS / jQuery版本”时,提供原始正则表达式不能解决问题。
Christian Ternus

我是OP。当时我是一名新开发人员,正在寻求JS中的即用型解决方案。确实,没有任何上下文的原始正则表达式字符串根本没有帮助。加上它是不完整的。
Chamilyan

0

解析域 -一个非常可靠的轻量级库

npm install parse-domain

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

例子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' ] }

例子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' ] }

为什么?

我强烈建议您根据使用情况和容量,避免使用正则表达式或其他字符串处理方式自己解决此问题。此问题的核心是您需要了解所有gtld和cctld后缀,才能将url字符串正确解析为domain和subdomains,这些后缀会定期更新。这是一个已解决的问题,不是您要解决的问题(除非您是google之类的人)。除非您需要紧急情况下的主机名或域名,否则不要尝试解析出该主机名或域名。


可能是环境/版本问题,请查看此npmjs.com/package/parse-domain
Glen Thompson,

-1

我的代码如下所示。正则表达式可以有多种形式,这是我的测试用例,我认为它更具扩展性。

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


-6

尝试使用正则表达式在下面的代码中获取确切的域名,

字符串行=“ 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");
  }

2
OP正在寻找JavaScript而不是Java的答案。
Piersadrian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.