当前位置:  开发笔记 > 编程语言 > 正文

如何从JavaScript中的字符串中提取基本URL?

如何解决《如何从JavaScript中的字符串中提取基本URL?》经验,为你挑选了12个好方法。

我正在尝试找到一种相对简单可靠的方法,使用JavaScript(或jQuery)从字符串变量中提取基本URL.

例如,给出如下内容:

http://www.sitename.com/article/2009/09/14/this-is-an-article/

我想得到:

http://www.sitename.com/

正则表达式是最好的选择吗?如果是这样,我可以使用什么语句将从给定字符串中提取的基本URL分配给新变量?

我已经对此进行了一些搜索,但我在JavaScript世界中找到的所有内容似乎都围绕着使用location.host或类似方法从实际文档URL收集此信息.



1> 小智..:

编辑:有人抱怨它没有考虑协议.所以我决定升级代码,因为它被标记为答案.对于那些喜欢单行代码的人...很抱歉这就是为什么我们使用代码最小化,代码应该是人类可读的,这种方式更好......在我看来.

var pathArray = "https://somedomain.com".split( '/' );
var protocol = pathArray[0];
var host = pathArray[2];
var url = protocol + '//' + host;

或者从下面使用Davids解决方案.


感谢您的回复,但我再次尝试从字符串中提取基本URL,而不是实际的文档URL.我不认为这会对我有所帮助 - 但如果我错了请纠正我.
知道了 - 感谢Rafal和daddywoodland!我最终使用:url ='http://www.sitename.com/article/2009/09/14/this-is-an-article/'; pathArray =(url).split('/'); host ='http://'+ pathArray [2]; 我认为Rafal的例子只是省略了我正在处理的所有字符串中出现的"http://",在这种情况下,pathArray [2]就是你需要的那个.没有"http://"前缀,pathArray [0]就是那个.再次感谢.
为什么所有变量声明?`url ='sitename.com/article/2009/09/14/this-is-an-article'; newurl ='http://'+ url.split('/')[0];`
此解决方案不考虑协议是否为https://或其他内容.

2> David..:

基于WebKit的浏览器,Firefox版本21和当前版本的Internet Explorer(IE 10和11)实现location.origin.

location.origin包括URL 的协议,和可选的端口.

例如,location.originURL 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;


如果给出,`window.location.hostname`将错过端口号,因此请使用`window.location.host`.所以包含尾部斜杠的完整"basename"将是:`window.location.protocol +"//"+ window.location.host +"/";`
实际上,如果在我的情况下,您需要提供不同的端口号,window.location.hostname仍然很有用.

3> daddywoodlan..:

不需要使用jQuery,只需使用

location.hostname


谢谢 - 我不能用字符串,但是,我可以吗?我的理解是,只能使用文档URL.

4> epascarello..:

没有理由进行拆分以从作为链接的字符串获取路径,主机名等.你只需要使用一个链接

//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来轻松完成.


因为海报说他们正在使用jQuery.
为什么在没有jQuery的情况下显示如何在几个字节中添加50K的jQuery?

5> kta..:
var host = location.protocol + '//' + location.host + '/';



6> Abdennour TO..:
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"

凉!



7> Wayne..:

如果你正在使用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



8> alexandru.to..:

从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');



9> devansvd..:

好的,URL API对象避免了手动拆分和构造url的情况。

 let url = new URL('/sf/ask/17360801/');
 alert(url.origin);



10> 小智..:

您可以使用以下代码获取当前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);



11> Michael_Scha..:

我使用一个简单的正则表达式从网址中提取主机:

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/');
    });
});



12> BMiner..:

如果要从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元素或进行任何疯狂的操作。

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有