regex 正则表达式-提取子域和域

eqzww0vc  于 2023-03-13  发布在  其他
关注(0)|答案(7)|浏览(246)

我试图形成一个正则表达式(javascript/node.js),它将从任何给定的URL中提取子域和域部分。

[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)

现在,我正在考虑http,https协议,并从URL的子域+域部分中排除“www.”部分。我检查了这个表达式,它几乎可以工作。但是,这里有一个问题:

成功

'http://mplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

'http://lplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

失败

'http://play.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

'http://tplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

我只使用了结果数组中的第一个元素。我不明白为什么“play.”和“tplay.”不起作用。有人能在这方面帮助我吗?
“/p”和“/t”对于正则表达式计算器有什么意义吗?
有没有其他方法可以使用正则表达式从任何给定的URL中提取子域和域?
编辑-
示例:
=〉播放谷歌网站
https://mail.google.com/mail/u/0/#inbox 〉电子邮件。谷歌网站

koaltpgm

koaltpgm1#

您的正则表达式似乎不正确。请尝试以下正则表达式:

/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n?]+)/img

xfb7svmp

xfb7svmp2#

您大概是第一百万个尝试用JavaScript解析URL的人。我有点惊讶您没有看到任何关于SO的现有问题。您最不想做的事情就是编写另一个坏的regexp,请尊重那些为您的问题提供答案的人。
有很多文档库和方法可以处理这个问题。谷歌一下吧。最简单的方法是在内存中创建一个a元素,给它分配一个href,然后访问它的hostname和其他属性。参见http://tutorialzine.com/2013/07/quick-tip-parse-urls/。如果这不能让你的船浮起来,那么使用像uri.j s这样的库。
如果你真的不想使用库,并且坚持要重新发明轮子,那么至少做一些类似下面的事情:

function get_domain_from_url(url) {
    var a = document.createElement('a').
    a.setAttribute('href', url);
    return a.hostname;
}

从本质上讲,您是在将URL的子域/域部分的提取委托给浏览器的URL解析逻辑,这比您编写的任何东西都要好得多。
另请参阅Parse URL with jquery/ javascript?Parse URL with JavascriptHow do I parse a URL into hostname and path in javascript?parse URL with JavaScript or jQuery。你怎么会错过那些呢?抱歉,我必须投票将此作为重复关闭。

m4pnthwp

m4pnthwp3#

anubhava's answer中的RegExp相同,仅添加了对protocol-relative URLs(如//google.com)的支持:

/^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)/im

RegEx Demo

oprakyz7

oprakyz74#

下面是忽略://之前的所有内容的解决方案

.*\://?([^\/]+)

如果您想忽略www.

.*\://(?:www.)?([^\/]+)
dddzy1tm

dddzy1tm5#

你的正则表达式运行得很好。你只需要去掉括号。最后的表达式是:

^(?:http:\/\/|www\.|https:\/\/)([^\/]+)

希望有用!

eoxn13cs

eoxn13cs6#

我知道我迟到了,但我想回答这个问题与一些额外的有用的信息。
使用regex从链接获取域名。

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

下面是above regex的链接。
如果你想得到subdomainsplit是上述正则表达式与第一个.匹配的结果

注意:regex比语言内置模块快。检查以下示例,regex比内置模块快15倍

使用正则表达式的javascript示例:

console.time('time2');
const pttrn = /^(https?:\/\/)?(www\.)?([^\/]+)/gm
const urlInfo = pttrn.exec("https://www.google.co.in/imghp");
console.timeEnd('time2');

//time2: 0.055ms
console.log(urlInfo[0]) // https://www.google.co.in
console.log(urlInfo[1]) // https://
console.log(urlInfo[2]) // www.
console.log(urlInfo[3]) // google.co.in

内置url模块的Nodejs

console.time('time');
const url = require('url');
const urlInfo = url.parse("https://www.google.co.in/imghp");
console.timeEnd('time');

//time: 0.840ms;
console.log(urlInfo.hostname) //www.google.co.in
pvabu6sv

pvabu6sv7#

此JavaScript正则表达式使用命名捕获组将链接/ URL分解为其功能组件:

console.log("https://www.sub.domain.google.com:443/maps/place/Arc+De+Triomphe/@48.8737917,2.2928388,17z?query=1&foo#hash".match(/^(?<protocol>https?:\/\/)(?=(?<fqdn>[^:/]+))(?:(?<service>www|ww\d|cdn|ftp|mail|pop\d?|ns\d?|git)\.)?(?:(?<subdomain>[^:/]+)\.)*(?<domain>[^:/]+\.[a-z0-9]+)(?::(?<port>\d+))?(?<path>\/[^?]*)?(?:\?(?<query>[^#]*))?(?:#(?<hash>.*))?/i).groups)

输出:

{
  "protocol": "https://",
  "fqdn": "www.sub.domain.google.com",
  "service": "www",
  "subdomain": "sub.domain",
  "domain": "google.com",
  "port": "443",
  "path": "/maps/place/Arc+De+Triomphe/@48.8737917,2.2928388,17z",
  "query": "query=1&foo",
  "hash": "hash"
}

所以你可以用任何你喜欢的部件

相关问题