如何从JavaScript中的URL中提取主机?

捕获域直到结束字符$, \?, /, : 。 我需要一个正则expression式来捕获所有这些domian.com

 domain.com:3000 domain.com?pass=gas domain.com/ domain.com 

如果您确实拥有有效的url,则可以这样做:

 var urls = [ 'http://domain.com:3000', 'http://domain.com?pass=gas', 'http://domain.com/', 'http://domain.com' ]; for (x in urls) { var a = document.createElement('a'); a.href = urls[x]; console.log(a.hostname); } //=> domain.com //=> domain.com //=> domain.com //=> domain.com 

请注意,使用正则expression式这种事情是愚蠢的,当你正在使用的语言有其他内置的方法。

A元素上可用的其他属性。

 var a = document.createElement('a'); a.href = "http://domain.com:3000/path/to/something?query=string#fragment" a.protocol //=> http: a.hostname //=> domain.com a.port //=> 3000 a.pathname //=> /path/to/something a.search //=> ?query=string a.hash //=> #fragment a.host //=> domain.com:3000 

编辑#2

经过进一步考虑,我查看了Node.js文档,发现了这个小小的gem: url#parse

上面的代码可以被重写为:

 var url = require('url'); var urls = [ 'http://domain.com:3000', 'http://domain.com?pass=gas', 'http://domain.com/', 'http://domain.com' ]; for (x in urls) { console.log(url.parse(urls[x]).hostname); } //=> domain.com //=> domain.com //=> domain.com //=> domain.com 

编辑#1

如果您想了解如何使用jsdomnodejs来解决这个问题,请参阅本文的修订历史logging

由于您使用节点,只需使用内置的url.parse()方法; 你想得到的hostname属性:

 var url=require('url'); var urls = [ 'http://domain.com:3000', 'http://domain.com?pass=gas', 'http://domain.com/', 'http://domain.com' ]; 

更新:

 urls.forEach(function(x) { console.log(url.parse(x).hostname); }); 
 /^((?:[a-z0-9-_]+\.)*[a-z0-9-_]+\.?)(?::([0-9]+))?(.*)$/i 

比赛是主机,端口,path