我试图形成一个正则表达式(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 〉电子邮件。谷歌网站
7条答案
按热度按时间koaltpgm1#
您的正则表达式似乎不正确。请尝试以下正则表达式:
xfb7svmp2#
您大概是第一百万个尝试用JavaScript解析URL的人。我有点惊讶您没有看到任何关于SO的现有问题。您最不想做的事情就是编写另一个坏的regexp,请尊重那些为您的问题提供答案的人。
有很多文档库和方法可以处理这个问题。谷歌一下吧。最简单的方法是在内存中创建一个
a
元素,给它分配一个href
,然后访问它的hostname
和其他属性。参见http://tutorialzine.com/2013/07/quick-tip-parse-urls/。如果这不能让你的船浮起来,那么使用像uri.j s这样的库。如果你真的不想使用库,并且坚持要重新发明轮子,那么至少做一些类似下面的事情:
从本质上讲,您是在将URL的子域/域部分的提取委托给浏览器的URL解析逻辑,这比您编写的任何东西都要好得多。
另请参阅Parse URL with jquery/ javascript?,Parse URL with Javascript,How do I parse a URL into hostname and path in javascript?或parse URL with JavaScript or jQuery。你怎么会错过那些呢?抱歉,我必须投票将此作为重复关闭。
m4pnthwp3#
与anubhava's answer中的RegExp相同,仅添加了对protocol-relative URLs(如
//google.com
)的支持:RegEx Demo
oprakyz74#
下面是忽略
://
之前的所有内容的解决方案如果您想忽略
www.
dddzy1tm5#
你的正则表达式运行得很好。你只需要去掉括号。最后的表达式是:
希望有用!
eoxn13cs6#
我知道我迟到了,但我想回答这个问题与一些额外的有用的信息。
使用regex从链接获取域名。
下面是above regex的链接。
如果你想得到
subdomain
,split
是上述正则表达式与第一个.
匹配的结果注意:
regex
比语言内置模块快。检查以下示例,regex
比内置模块快15倍使用正则表达式的javascript示例:
内置url模块的Nodejs
pvabu6sv7#
此JavaScript正则表达式使用命名捕获组将链接/ URL分解为其功能组件:
输出:
所以你可以用任何你喜欢的部件