我正在尝试使用JavaScript(或jQuery)从字符串变量中提取相对简单可靠的方法来提取基本URL。
例如,给出类似:
http://www.sitename.com/article/2009/09/14/this-is-an-article/
我想得到:
http://www.sitename.com/
正则表达式是最好的选择吗?如果是这样,我可以使用什么语句将从给定字符串中提取的基本URL分配给新变量?
我已经对此进行了一些搜索,但我在JavaScript世界中找到的所有内容似乎都围绕着使用 location.host 或类似方法从实际文档URL收集此信息。
答案 0 :(得分:194)
编辑:有人抱怨它没有考虑协议。所以我决定升级代码,因为它被标记为答案。对于那些喜欢单行代码的人...很抱歉这就是为什么我们使用代码最小化,代码应该是人类可读的,这种方式更好......在我看来。
var pathArray = "https://somedomain.com".split( '/' );
var protocol = pathArray[0];
var host = pathArray[2];
var url = protocol + '//' + host;
或者从下面使用Davids solution。
答案 1 :(得分:150)
基于WebKit的浏览器,Firefox版本21和当前版本的Internet Explorer(IE 10和11)实现location.origin
。
location.origin
包含协议,域以及网址的端口。
例如,网址location.origin
的{{1}}为http://www.sitename.com/article/2009/09/14/this-is-an-article/
。
要定位不支持http://www.sitename.com
的浏览器,请使用以下简洁的polyfill:
location.origin
答案 2 :(得分:44)
不需要使用jQuery,只需使用
location.hostname
答案 3 :(得分:29)
没有理由进行拆分以从作为链接的字符串获取路径,主机名等。您只需要使用链接
//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来轻松完成。
答案 4 :(得分:20)
var host = location.protocol + '//' + location.host + '/';
答案 5 :(得分:15)
String.prototype.url = function() {
const a = $('<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
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"
酷!
答案 6 :(得分:12)
如果你正在使用jQuery,这是一种很好的方式来操作javascript中的元素而不将它们添加到DOM:
var myAnchor = $("<a />");
//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
答案 7 :(得分:10)
从道路的字符串表示中获取基本值的轻便而完整的方法是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');
答案 8 :(得分:6)
您可以使用以下代码获取当前网址的不同参数
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);
答案 9 :(得分:6)
我使用一个简单的正则表达式从网址中提取主机:
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/');
});
});
答案 10 :(得分:5)
如果要从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元素或做任何疯狂的事情。
答案 11 :(得分:4)
function getBaseURL() {
var url = location.href; // entire url including querystring - also: window.location.href;
var baseURL = url.substring(0, url.indexOf('/', 14));
if (baseURL.indexOf('http://localhost') != -1) {
// Base Url for localhost
var url = location.href; // window.location.href;
var pathname = location.pathname; // window.location.pathname;
var index1 = url.indexOf(pathname);
var index2 = url.indexOf("/", index1 + 1);
var baseLocalUrl = url.substr(0, index2);
return baseLocalUrl + "/";
}
else {
// Root Url for domain name
return baseURL + "/";
}
}
然后你可以像这样使用它......
var str = 'http://en.wikipedia.org/wiki/Knopf?q=1&t=2';
var url = str.toUrl();
url的值将是......
{
"original":"http://en.wikipedia.org/wiki/Knopf?q=1&t=2",<br/>"protocol":"http:",
"domain":"wikipedia.org",<br/>"host":"en.wikipedia.org",<br/>"relativePath":"wiki"
}
“var url”还包含两种方法。
var paramQ = url.getParameter('q');
在这种情况下,paramQ的值将为1.
var allParameters = url.getParameters();
allParameters的值仅为参数名称。
["q","t"]
在IE,Chrome和Firefox上测试过。
答案 12 :(得分:4)
好吧,URL API object避免了手动分割和构建网址。
let url = new URL('https://stackoverflow.com/questions/1420881');
alert(url.origin);
答案 13 :(得分:3)
不必考虑window.location.protocol和window.location.origin,并且可能缺少指定的端口号等,只需抓住所有内容到第3个“/”:
// get nth occurrence of a character c in the calling string
String.prototype.nthIndex = function (n, c) {
var index = -1;
while (n-- > 0) {
index++;
if (this.substring(index) == "") return -1; // don't run off the end
index += this.substring(index).indexOf(c);
}
return index;
}
// get the base URL of the current page by taking everything up to the third "/" in the URL
function getBaseURL() {
return document.URL.substring(0, document.URL.nthIndex(3,"/") + 1);
}
答案 14 :(得分:2)
这有效:
location.href.split(location.pathname)[0];
答案 15 :(得分:2)
您可以使用正则表达式执行此操作:
/(http:\/\/)?(www)[^\/]+\//i
适合吗?
答案 16 :(得分:1)
要获取任何URL的来源,包括网站(/my/path
)或无模式(//example.com/my/path
)或完整(http://example.com/my/path
)内的路径,我组合了一个快速功能。 / p>
在下面的代码段中,所有三个呼叫都应记录为https://stacksnippets.net
。
function getOrigin(url)
{
if(/^\/\//.test(url))
{ // no scheme, use current scheme, extract domain
url = window.location.protocol + url;
}
else if(/^\//.test(url))
{ // just path, use whole origin
url = window.location.origin + url;
}
return url.match(/^([^/]+\/\/[^/]+)/)[0];
}
console.log(getOrigin('https://stacksnippets.net/my/path'));
console.log(getOrigin('//stacksnippets.net/my/path'));
console.log(getOrigin('/my/path'));
答案 17 :(得分:1)
一个好方法是使用JavaScript本机api URL
对象。这提供了许多有用的网址部分。
例如:
const url = 'https://stackoverflow.com/questions/1420881/how-to-extract-base-url-from-a-string-in-javascript'
const urlObject = new URL(url);
console.log(urlObject);
// RESULT:
//________________________________
hash: "",
host: "stackoverflow.com",
hostname: "stackoverflow.com",
href: "https://stackoverflow.com/questions/1420881/how-to-extract-base-url-from-a-string-in-javascript",
origin: "https://stackoverflow.com",
password: "",
pathname: "/questions/1420881/how-to-extract-base-url-from-a-string-in-javaript",
port: "",
protocol: "https:",
search: "",
searchParams: [object URLSearchParams]
... + some other methods
正如您在这里看到的那样,您可以访问所需的任何内容。
例如:console.log(urlObject.host); // "stackoverflow.com"
URL的文档
答案 18 :(得分:0)
这对我有用:
var getBaseUrl = function (url) {
if (url) {
var parts = url.split('://');
if (parts.length > 1) {
return parts[0] + '://' + parts[1].split('/')[0] + '/';
} else {
return parts[0].split('/')[0] + '/';
}
}
};
&#13;
答案 19 :(得分:0)
var tilllastbackslashregex = new RegExp(/^.*\//);
baseUrl = tilllastbackslashregex.exec(window.location.href);
答案 20 :(得分:0)
实施:
const getOriginByUrl = url => url.split('/').slice(0, 3).join('/');
测试:
getOriginByUrl('http://www.sitename.com:3030/article/2009/09/14/this-is-an-article?lala=kuku');
结果:
'http://www.sitename.com:3030'