我正在尝试找到一种相对简单可靠的方法,使用JavaScript(或jQuery)从字符串变量中提取基本URL.
例如,给出如下内容:
http://www.sitename.com/article/2009/09/14/this-is-an-article/
我想得到:
http://www.sitename.com/
正则表达式是最好的选择吗?如果是这样,我可以使用什么语句将从给定字符串中提取的基本URL分配给新变量?
我已经对此进行了一些搜索,但我在JavaScript世界中找到的所有内容似乎都围绕着使用location.host或类似方法从实际文档URL收集此信息.
编辑:有人抱怨它没有考虑协议.所以我决定升级代码,因为它被标记为答案.对于那些喜欢单行代码的人...很抱歉这就是为什么我们使用代码最小化,代码应该是人类可读的,这种方式更好......在我看来.
var pathArray = "https://somedomain.com".split( '/' ); var protocol = pathArray[0]; var host = pathArray[2]; var url = protocol + '//' + host;
或者从下面使用Davids解决方案.
基于WebKit的浏览器,Firefox版本21和当前版本的Internet Explorer(IE 10和11)实现location.origin
.
location.origin
包括URL 的协议,域和可选的端口.
例如,location.origin
URL http://www.sitename.com/article/2009/09/14/this-is-an-article/
是http://www.sitename.com
.
要在不支持的情况下定位浏览器,请location.origin
使用以下简洁的polyfill:
if (typeof location.origin === 'undefined') location.origin = location.protocol + '//' + location.host;
不需要使用jQuery,只需使用
location.hostname
没有理由进行拆分以从作为链接的字符串获取路径,主机名等.你只需要使用一个链接
//create a new element link with your link var a = document.createElement("a"); a.href="http://www.sitename.com/article/2009/09/14/this-is-an-article/"; //hide it from view when it is added a.style.display="none"; //add it document.body.appendChild(a); //read the links "features" alert(a.protocol); alert(a.hostname) alert(a.pathname) alert(a.port); alert(a.hash); //remove it document.body.removeChild(a);
您可以使用jQuery附加元素并读取其attr来轻松完成.
var host = location.protocol + '//' + location.host + '/';
String.prototype.url = function() { const a = $('').attr('href', this)[0]; // or if you are not using jQuery // const a = document.createElement('a'); a.setAttribute('href', this); let origin = a.protocol + '//' + a.hostname; if (a.port.length > 0) { origin = `${origin}:${a.port}`; } const {host, hostname, pathname, port, protocol, search, hash} = a; return {origin, host, hostname, pathname, port, protocol, search, hash}; }
然后 :
'http://mysite:5050/pke45#23'.url() //OUTPUT : {host: "mysite:5050", hostname: "mysite", pathname: "/pke45", port: "5050", protocol: "http:",hash:"#23",origin:"http://mysite:5050"}
根据您的要求,您需要:
'http://mysite:5050/pke45#23'.url().origin回顾07-2017:它也可以更优雅,功能更多
const parseUrl = (string, prop) => { const a = document.createElement('a'); a.setAttribute('href', string); const {host, hostname, pathname, port, protocol, search, hash} = a; const origin = `${protocol}//${hostname}${port.length ? `:${port}`:''}`; return prop ? eval(prop) : {origin, host, hostname, pathname, port, protocol, search, hash} }
然后
parseUrl('http://mysite:5050/pke45#23') // {origin: "http://mysite:5050", host: "mysite:5050", hostname: "mysite", pathname: "/pke45", port: "5050"…} parseUrl('http://mysite:5050/pke45#23', 'origin') // "http://mysite:5050"
凉!
如果你正在使用jQuery,这是一种很好的方式来操作javascript中的元素而不将它们添加到DOM:
var myAnchor = $(""); //set href myAnchor.attr('href', 'http://example.com/path/to/myfile') //your link's features var hostname = myAnchor.attr('hostname'); // http://example.com var pathname = myAnchor.attr('pathname'); // /path/to/my/file //...etc
从URL的字符串表示中获取基本值的轻便而完整的方法是Douglas Crockford的正则表达式规则:
var yourUrl = "http://www.sitename.com/article/2009/09/14/this-is-an-article/"; var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; var parts = parse_url.exec( yourUrl ); var result = parts[1]+':'+parts[2]+parts[3]+'/' ;
如果您正在寻找更强大的URL操作工具包,请尝试使用URI.js它支持getter,setter,url规范化等所有这些都具有良好的可链接API.
如果您正在寻找一个jQuery插件,那么jquery.url.js可以帮助您
更简单的方法是使用锚元素,如@epascarello建议的那样.这样做的缺点是你必须创建一个DOM元素.但是,这可以缓存在一个闭包中并重用于多个url:
var parseUrl = (function () { var a = document.createElement('a'); return function (url) { a.href = url; return { host: a.host, hostname: a.hostname, pathname: a.pathname, port: a.port, protocol: a.protocol, search: a.search, hash: a.hash }; } })();
像这样使用它:
paserUrl('http://google.com');
好的,URL API对象避免了手动拆分和构造url的情况。
let url = new URL('/sf/ask/17360801/'); alert(url.origin);
您可以使用以下代码获取当前URL的不同参数
alert("document.URL : "+document.URL); alert("document.location.href : "+document.location.href); alert("document.location.origin : "+document.location.origin); alert("document.location.hostname : "+document.location.hostname); alert("document.location.host : "+document.location.host); alert("document.location.pathname : "+document.location.pathname);
我使用一个简单的正则表达式从网址中提取主机:
function get_host(url){ return url.replace(/^((\w+:)?\/\/[^\/]+\/?).*$/,'$1'); }
并像这样使用它
var url = 'http://www.sitename.com/article/2009/09/14/this-is-an-article/' var host = get_host(url);
请注意,如果url
不以结束/
该host
不会在结束/
.
以下是一些测试:
describe('get_host', function(){ it('should return the host', function(){ var url = 'http://www.sitename.com/article/2009/09/14/this-is-an-article/'; assert.equal(get_host(url),'http://www.sitename.com/'); }); it('should not have a / if the url has no /', function(){ var url = 'http://www.sitename.com'; assert.equal(get_host(url),'http://www.sitename.com'); }); it('should deal with https', function(){ var url = 'https://www.sitename.com/article/2009/09/14/this-is-an-article/'; assert.equal(get_host(url),'https://www.sitename.com/'); }); it('should deal with no protocol urls', function(){ var url = '//www.sitename.com/article/2009/09/14/this-is-an-article/'; assert.equal(get_host(url),'//www.sitename.com/'); }); it('should deal with ports', function(){ var url = 'http://www.sitename.com:8080/article/2009/09/14/this-is-an-article/'; assert.equal(get_host(url),'http://www.sitename.com:8080/'); }); it('should deal with localhost', function(){ var url = 'http://localhost/article/2009/09/14/this-is-an-article/'; assert.equal(get_host(url),'http://localhost/'); }); it('should deal with numeric ip', function(){ var url = 'http://192.168.18.1/article/2009/09/14/this-is-an-article/'; assert.equal(get_host(url),'http://192.168.18.1/'); }); });
如果要从window.location.href(地址栏)提取信息,请使用以下代码获取http://www.sitename.com/
:
var loc = location; var url = loc.protocol + "//" + loc.host + "/";
如果您有一个字符串,str
即任意URL(不是window.location.href),则使用正则表达式:
var url = str.match(/^(([a-z]+:)?(\/\/)?[^\/]+\/).*$/)[1];
我像宇宙中的每个人一样,讨厌阅读正则表达式,所以我将其分解为英文:
查找零个或多个字母字符,后跟一个冒号(协议,可以省略)
后跟//(也可以省略)
后跟除/(主机名和端口)以外的任何字符
其次是 /
紧随其后的是什么(路径,减去开头/)。
无需创建DOM元素或进行任何疯狂的操作。