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

sun*_*rba 18 javascript regex subdomain url

我正在尝试形成一个正则表达式(javascript/node.js),它将从任何给定的URL中提取子域和域部分.这就是我最终得到的结果:

[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)
Run Code Online (Sandbox Code Playgroud)

现在,我只是考虑http,https for protocol&exclude"www." 来自URL的子域+域部分的部分.我检查了表达式,它几乎可以工作.但是,问题在于:

成功

'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)
Run Code Online (Sandbox Code Playgroud)

失败

'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)
Run Code Online (Sandbox Code Playgroud)

我只使用结果数组中的第一个元素.我无法理解为什么"玩".&"tplay." 不起作用.有人可以帮我这方面吗?

"/ p"和"/ t"对正则表达式求值程序有什么意义吗?

有没有其他方法使用正则表达式从任何给定的URL中提取子域和域?

编辑 -

例:

https://play.google.com/store/apps/details?id=com.skgames.trafficracer => play.google.com

https://mail.google.com/mail/u/0/#inbox => mail.google.com

anu*_*ava 56

你的正则表达式似乎不正确.试试这个正则表达式:

/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n?]+)/img
Run Code Online (Sandbox Code Playgroud)

RegEx演示

  • 正确一个是`/ ^(?:@https?:\// /)?(?:[^@\/\n]+@)?(?:www..)?([^:\/\n] +)/ im` (5认同)

小智 11

您是第一个尝试解析JavaScript中的URL的人.我有点惊讶你没有看到任何关于SO追溯年代的现有问题.你要做的最后一件事就是编写另一个破坏的正则表达式,并对那些为你的问题提供答案的人给予应有的尊重.

有许多记录良好的库和方法来处理这个问题.谷歌一下.最简单的方法是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;
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,您将URL的子域/域部分的提取委托给浏览器的URL解析逻辑,这比您将要编写的任何内容都要好.

另请参阅使用jquery/javascript解析URL?,使用Javascript解析URL,如何在javascript中将URL解析为主机名和路径?,或使用JavaScript或jQuery解析URL.你是怎么想念那些的?对不起,我必须投票将其作为副本关闭.

  • 我不需要图书馆。我知道可用于解析 URL 的库。我需要一个正则表达式。我面临的情况是,我无法继续编写 javascript 代码。该函数采用正则表达式、选项和应作为正则表达式操作的值作为参数并返回第一个匹配项。 (3认同)
  • 然后使用这个: `var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@ )?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\. (?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\ \d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[az\\u00a1-\\uffff0-9]+ -?)*[az\\u00a1-\\uffff0-9]+)(?:\\.(?:[az\\u00a1-\\uffff0-9]+-?)*[az\\u00a1- \\uffff0-9]+)*(?:\\.(?:[az\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5} )?(?:(/|\\?|#)[^\\s]*)?$';` (2认同)
  • 此代码不在浏览器端使用。它在 node.js 中使用。是的,node.js 有可以使用的“url”模块。但是,不幸的是,由于前面所述的原因,我无法使用它。您的正则表达式负责处理我们将要遇到的大多数 URL 类型。为此非常感谢。 (2认同)

Nic*_*rdu 6

anubhava's答案中的RegExp相同,仅增加了对协议相对URL的支持,例如//google.com

/^(?:https?:)?(?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)/im
Run Code Online (Sandbox Code Playgroud)

正则演示


Ash*_*lla 5

这是一个忽略之前所有内容的解决方案 ://

.*\://?([^\/]+)
Run Code Online (Sandbox Code Playgroud)

如果你想忽略 www.

.*\://(?:www.)?([^\/]+)
Run Code Online (Sandbox Code Playgroud)