从URL获取协议,域和端口
我需要从给定的URL中提取完整的协议,域和端口。 例如:
https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer >>> https://localhost:8181
首先得到当前的地址
var url = window.location.href
然后parsing这个string
var arr = url.split("/");
你的url是:
var result = arr[0] + "//" + arr[2]
希望这可以帮助
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
这些答案似乎都没有完全解决这个问题,这需要一个任意的url,不是特别的当前页面。
利用浏览器的内置parsing器
如果你想分解任何给定的url,你可以利用DOM方法:
// create an anchor element (note: no need to append this element to the document) var link = document.createElement('a'); // set href to any path link.setAttribute('href', 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10');
而已!
浏览器的内置parsing器已经完成了它的工作。 现在你可以抓住你需要的零件:
// get any piece of the url you're interested in link.hostname; // 'example.com' link.port; // 12345 link.search; // '?startIndex=1&pageSize=10' link.pathname; // '/blog/foo/bar' link.protocol; // 'http:' // cleanup for garbage collection link = null;
奖金
因为'?startIndex = 1&pageSize = 10'本身不太可用,所以你可能会想要分割searchurl params。
这有两个function,将照顾到这一点:
/** * Break apart any path into parts * 'http://example.com:12345/blog/foo/bar?startIndex=1&pageSize=10' -> * { * "host": "example.com", * "port": "12345", * "search": { * "startIndex": "1", * "pageSize": "10" * }, * "path": "/blog/foo/bar", * "protocol": "http:" * } */ function getPathInfo(path) { // create a link in the DOM and set its href var link = document.createElement('a'); link.setAttribute('href', path); // return an easy-to-use object that breaks apart the path return { host: link.hostname, // 'example.com' port: link.port, // 12345 search: processSearchParams(link.search), // {startIndex: 1, pageSize: 10} path: link.pathname, // '/blog/foo/bar' protocol: link.protocol // 'http:' } } /** * Convert search param string into an object or array * '?startIndex=1&pageSize=10' -> {startIndex: 1, pageSize: 10} */ function processSearchParams(search, preserveDuplicates) { // option to preserve duplicate keys (eg 'sort=name&sort=age') preserveDuplicates = preserveDuplicates || false; // disabled by default var outputNoDupes = {}; var outputWithDupes = []; // optional output array to preserve duplicate keys // sanity check if(!search) throw new Error('processSearchParams: expecting "search" input parameter'); // remove ? separator (?foo=1&bar=2 -> 'foo=1&bar=2') search = search.split('?')[1]; // split apart keys into an array ('foo=1&bar=2' -> ['foo=1', 'bar=2']) search = search.split('&'); // separate keys from values (['foo=1', 'bar=2'] -> [{foo:1}, {bar:2}]) // also construct simplified outputObj outputWithDupes = search.map(function(keyval){ var out = {}; keyval = keyval.split('='); out[keyval[0]] = keyval[1]; outputNoDupes[keyval[0]] = keyval[1]; // might as well do the no-dupe work too while we're in the loop return out; }); return (preserveDuplicates) ? outputWithDupes : outputNoDupes; }
出于某种原因,所有的答案都是过度的。 这是所需要的:
window.location.origin
更多细节可以在这里find: https : //developer.mozilla.org/en-US/docs/Web/API/window.location#Properties
正如已经提到的那样,目前还没有完全支持window.location.origin
,而不是使用它或者创build一个新的variables来使用,我更喜欢检查它,如果它没有设置它。
例如;
if (!window.location.origin) { window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: ''); }
我其实写了几个月后这个修复window.location.origin
主办
var url = window.location.host;
返回localhost:2679
主机名
var url = window.location.hostname;
返回localhost
协议属性设置或返回当前URL的协议,包括冒号(:)。
这意味着如果你只想得到HTTP / HTTPS部分,你可以这样做:
var protocol = window.location.protocol.replace(/:/g,'')
对于您可以使用的域名:
var domain = window.location.hostname;
对于您可以使用的端口:
var port = window.location.port;
请记住,如果端口在URL中不可见,则它将是一个空string。 例如:
如果您没有端口使用时需要显示80/443
var port = window.location.port || (protocol === 'https' ? '443' : '80');
事实上, window.location.origin在浏览器中可以很好地遵循标准,但是猜测是什么。 IE不符合标准。
所以正因为如此,IE,FireFox和Chrome对我来说都是如此:
var full = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: '');
但是对于未来可能导致冲突的增强,我在“位置”对象之前指定了“窗口”引用。
var full = window.location.protocol+'//'+window.location.hostname+(window.location.port ? ':'+window.location.port: '');
var http = location.protocol; var slashes = http.concat("//"); var host = slashes.concat(window.location.hostname);
var getBasePath = function(url) { var r = ('' + url).match(/^(https?:)?\/\/[^/]+/i); return r ? r[0] : ''; };
尝试使用正则expression式(正则expression式),这将是非常有用的,当你想validation/提取的东西,甚至做一些简单的JavaScriptparsing。
正则expression式是:
/([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/
示范:
function breakURL(url){ matches = /([a-zA-Z]+):\/\/([\-\w\.]+)(?:\:(\d{0,5}))?/.exec(url); foo = new Array(); if(matches){ for( i = 1; i < matches.length ; i++){ foo.push(matches[i]); } } return foo } url = "https://www.google.co.uk:55699/search?q=http%3A%2F%2F&oq=http%3A%2F%2F&aqs=chrome..69i57j69i60l3j69i65l2.2342j0j4&sourceid=chrome&ie=UTF-8" breakURL(url); // [https, www.google.co.uk, 55699] breakURL(); // [] breakURL("asf"); // [] breakURL("asd://"); // [] breakURL("asd://a"); // [asd, a, undefined]
现在你可以做validation了。
大卫的答案是伟大的,非常全面的,但不会与服务器端的JavaScript,因为document.createElement调用(文档不会被定义)。
我写了一个简单的组件 ,覆盖了服务器上或浏览器中的任意URL,并将它们parsing成一个对象。 您可以按如下方式使用parseUrl()来获取没有path或查询string的基础url和端口:
var url = 'https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer'; var urlObject = parseUrl(url); var newUrl = urlObject.protocol + '//' + urlObject.host;
像David的方法一样,这也提供了url对象中的所有url部分。
urlObject.href // 'https://localhost:8181/ContactUs-1.0/contact?lang=it&report_type=consumer' urlObject.searchParams // { lang: 'it', report_type: 'consumer' } urlObject.hash // '' urlObject.search // '?lang=it&report_type=consumer' urlObject.protocol // 'https:' urlObject.host // 'localhost:8181' urlObject.hostname // 'localhost' urlObject.path // '/ContactUs-1.0/contact'
随意导入组件以使用parseUrl方法。