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

时间:2014-09-06 18:16:59

标签: javascript regex url subdomain

我试图形成一个正则表达式(javascript / node.js),它将提取子域&来自任何给定URL的域部分。这就是我最终的结果:

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

现在,我只考虑http,https for protocol&排除" 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)

失败

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

我只使用结果数组中的第一个元素。我无法理解为什么"玩。" &安培; " T播放&#34。不起作用。有人可以帮我这方面吗?

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

5 个答案:

答案 0 :(得分:52)

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

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

RegEx Demo

答案 1 :(得分:10)

您是第一个尝试解析JavaScript中的网址的人。我有点惊讶你没有看到任何关于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;
}

基本上,您将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。你是怎么想念那些的?对不起,我必须投票将其作为副本关闭。

答案 2 :(得分:5)

anubhava's接受的答案相同的RegExp,仅添加//google.com protocol-relative URLs的支持:

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

RegEx Demo

答案 3 :(得分:4)

这是一个忽略://

之前所有内容的解决方案
.*\://?([^\/]+)

如果你想忽略www.

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

答案 4 :(得分:1)

你的正则表达式表达非常好。您只需要删除括号。最后的表达是:

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

希望它有用!