如何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); }
它基本上给我的域名,反正我也可以得到所有的域名后的东西? 在这种情况下,它将是aaaa
variables的/blah/sdgsdgsdgs
。
请注意,这个解决scheme不是最好的。 我只是为了配合OP的要求而做的。 我个人会build议寻找其他答案。
下面的正则expression式会让你回到域名和其他。 :\/\/(.[^\/]+)(.*)
:
- http://www.google.com
- / 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"