如何parsing一个URL?

如果有一件事我只是不能让我的头,这是正则expression式。

所以经过很多的search,我终于find了一个适合我的需求:

function get_domain_name() { aaaa="http://www.somesite.se/blah/sdgsdgsdgs"; //aaaa="http://somesite.se/blah/sese"; domain_name_parts = aaaa.match(/:\/\/(.[^/]+)/)[1].split('.'); if(domain_name_parts.length >= 3){ domain_name_parts[0] = ''; } var domain = domain_name_parts.join('.'); if(domain.indexOf('.') == 0) alert("1"+ domain.substr(1)); else alert("2"+ domain); } 

它基本上给我的域名,反正我也可以得到所有的域名后的东西? 在这种情况下,它将是aaaavariables的/blah/sdgsdgsdgs

请注意,这个解决scheme不是最好的。 我只是为了配合OP的要求而做的。 我个人会build议寻找其他答案。

下面的正则expression式会让你回到域名和其他。 :\/\/(.[^\/]+)(.*)

  1. http://www.google.com
  2. / goosomething

我build议你在这里学习RegExp文档: http : //www.regular-expressions.info/reference.html

使用你的function:

 function get_domain_name() { aaaa="http://www.somesite.se/blah/sdgsdgsdgs"; //aaaa="http://somesite.se/blah/sese"; var matches = aaaa.match(/:\/\/(?:www\.)?(.[^/]+)(.*)/); alert(matches[1]); alert(matches[2]); } 

而不是依赖一个潜在的不可靠的* regex,而应该使用JavaScript DOM API提供的内置URLparsing器:

 var url = document.createElement('a'); url.href = "http://www.example.com/some/path?name=value#anchor"; 

这就是parsingURL所需要做的。 其他一切只是访问分析的值:

 url.protocol; //(http:) url.hostname ; //(www.example.com) url.pathname ; //(/some/path) url.search ; // (?name=value) url.hash; //(#anchor) 

在这种情况下,如果你正在寻找/blah/sdgsdgsdgs ,你可以使用url.pathname

基本上,你只是在JavaScript中创build一个链接(技术上,锚点元素),然后你可以直接调用parsing的部分。 (由于不是将它添加到DOM中,因此它不会在任何地方添加任何不可见的链接。)它以与location对象上的值相同的方式进行访问。

(受到这个奇妙答案的启发。)

编辑:一个重要的注意事项:似乎Internet Explorer有一个错误,它忽略了这样的对象上的pathname属性的前导斜杠。 您可以通过执行如下操作来规范化它:

  url.pathname = url.pathname.replace(/(^\/?)/,"/"); 

注:*:我说“潜在不可靠”,因为尝试构build或find一个包含所有URL的parsing器是很有诱惑力的,但是有许多条件,边缘情况和容错parsing技术可能不被考虑或正确支持的; 浏览器可能是最好的实现(因为parsingURL是正确的操作的关键)这个逻辑,所以我们应该保持简单,留给他们。

RFC (见附录B)提供了一个正则expression式来parsingURI部分:

 ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9 

哪里

 scheme = $2 authority = $4 path = $5 query = $7 fragment = $9 

例:

 function parse_url(url) { var pattern = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"); var matches = url.match(pattern); return { scheme: matches[2], authority: matches[4], path: matches[5], query: matches[7], fragment: matches[9] }; } console.log(parse_url("http://www.somesite.se/blah/sdgsdgsdgs")); 

 Object authority: "www.somesite.se" fragment: undefined path: "/blah/sdgsdgsdgs" query: undefined scheme: "http" 

DEMO

你只需要修改你的正则expression式。 例如:

 var aaaa="http://www.somesite.se/blah/sdgsdgsdgs"; var m = aaaa.match(/^[^:]*:\/\/([^\/]+)(\/.*)$/); 

m将包含以下部分:

 ["http://www.somesite.se/blah/sdgsdgsdgs", "www.somesite.se", "/blah/sdgsdgsdgs"] 

这里是相同的例子,但修改,以便它将拆分“www”。 部分。 我认为正则expression式应该写出来,不pipe你是否拥有“www”,匹配都能起作用。 部分。 所以看看这个:

 var aaaa="http://www.somesite.se/blah/sdgsdgsdgs"; var m = aaaa.match(/^[^:]*:\/\/(www\.)?([^\/]+)(\/.*)$/); 

m将包含以下部分:

 ["http://www.somesite.se/blah/sdgsdgsdgs", "www.", "somesite.se", "/blah/sdgsdgsdgs"] 

现在检查出相同的正则expression式,但是不以“www”开头的url:

 var bbbb="http://somesite.se/blah/sdgsdgsdgs"; var m = .match(/^[^:]*:\/\/(www\.)?([^\/]+)(\/.*)$/); 

现在你的比赛看起来像这样:

 ["http://somesite.se/blah/sdgsdgsdgs", undefined, "somesite.se", "/blah/sdgsdgsdgs"] 

所以你可以看到它会在两种情况下做正确的事情。

有一个很好的parsingURL的jQuery插件: Purl 。

所有的正则expression式的东西都隐藏在里面,你会得到像这样的东西:

 > url = $.url("http://markdown.com/awesome/language/markdown.html?show=all#top"); > url.attr('source'); "http://markdown.com/awesome/language/markdown.html?show=all#top" > url.attr('protocol'); "http" > url.attr('host'); "markdown.com" > url.attr('relative'); "/awesome/language/markdown.html?show=all#top" > url.attr('path'); "/awesome/language/markdown.html" > url.attr('directory'); "/awesome/language/" > url.attr('file'); "markdown.html" > url.attr('query'); "show=all" > url.attr('fragment'); "top"