如何在 javascript 中将 URL 解析为主机名和路径?

IT技术 javascript url
2021-02-02 05:00:46

我想拿一根绳子

var a = "http://example.com/aa/bb/"

并将其处理成一个对象,使得

a.hostname == "example.com"

a.pathname == "/aa/bb"
6个回答

现代方式:

new URL("http://example.com/aa/bb/")

返回一个具有属性hostnameand的对象pathname,以及其他一些属性

第一个参数是相对或绝对 URL;如果它是相对的,那么您需要指定第二个参数(基本 URL)。例如,对于相对于当前页面的 URL:

new URL("/aa/bb/", location)

除了浏览器,这个API也可以的Node.js自V7通过require('url').URL

2021-03-10 05:00:46
@cwouter:它在 Edge 中确实有效,它取代了 IE
2021-03-18 05:00:46
好的!相对 URL 会破坏它... :( new URL('/stuff?foo=bar#baz')->SyntaxError: Failed to construct 'URL': Invalid URL
2021-03-21 05:00:46
JavaScript 没有内置的方法来解析在浏览器或服务器上运行的 URL 的事实是非常可悲的......
2021-04-01 05:00:46
这是这样做的方法,边缘已经是 ie 之上的 3 个版本,所以没关系
2021-04-09 05:00:46
var getLocation = function(href) {
    var l = document.createElement("a");
    l.href = href;
    return l;
};
var l = getLocation("http://example.com/path");
console.debug(l.hostname)
>> "example.com"
console.debug(l.pathname)
>> "/path"
您确定这是一个跨浏览器兼容的解决方案吗?
2021-03-24 05:00:46
应该注意的是,虽然这可能有助于/回答原始海报,但此答案仅适用于在浏览器中进行 JS 工作的人,因为它依赖于 DOM 来完成其工作。
2021-03-25 05:00:46
如果 href 是相对的,则在 IE 中不起作用。l.hostname 将为空。如果您只提供完整的 URL,那么这将起作用。
2021-03-25 05:00:46
即使使用绝对 URL,IE(在 IE 11 中测试)的行为也与 Chrome 和 Firefox 不同。IEpathname会删除前导斜杠,而其他浏览器则不会。所以你最终会得到/pathpath,这取决于你的浏览器。
2021-03-27 05:00:46
除了独创性之外,另一个简单的例子。
2021-04-03 05:00:46

在这里找到:https : //gist.github.com/jlong​​/2428561

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.host;     // => "example.com:3000"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.hash;     // => "#hash"
parser.search;   // => "?search=test"
parser.origin;   // => "http://example.com:3000"
对于 IE,使用 "/" + parser.pathname
2021-03-12 05:00:46
警告:http:即使您只传递domain.com给 href(没有任何协议),它也会返回我想用它来检查协议是否丢失,如果有,我可以添加它,但它假定 http: 所以无法为此目的使用它。
2021-03-19 05:00:46
请注意,如果您只想获取当前浏览器位置的解析部分,则第一两行变为,parser = location;并且以下所有行都有效。刚刚在Chrome和IE9中尝试过。
2021-03-29 05:00:46
主机名实际上包括协议。在最新版本的 Chrome 上测试。
2021-04-05 05:00:46
另请注意,pathname不包括 IE 中的前导斜杠。去搞清楚。:D
2021-04-09 05:00:46

这是一个使用正则表达式模拟a标签行为的简单函数

优点

  • 可预测的行为(没有跨浏览器问题)
  • 不需要 DOM
  • 它真的很短。

缺点

  • 正则表达式有点难以阅读

——

function getLocation(href) {
    var match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
    return match && {
        href: href,
        protocol: match[1],
        host: match[2],
        hostname: match[3],
        port: match[4],
        pathname: match[5],
        search: match[6],
        hash: match[7]
    }
}

——

getLocation("http://example.com/");
/*
{
    "protocol": "http:",
    "host": "example.com",
    "hostname": "example.com",
    "port": undefined,
    "pathname": "/"
    "search": "",
    "hash": "",
}
*/

getLocation("http://example.com:3000/pathname/?search=test#hash");
/*
{
    "protocol": "http:",
    "host": "example.com:3000",
    "hostname": "example.com",
    "port": "3000",
    "pathname": "/pathname/",
    "search": "?search=test",
    "hash": "#hash"
}
*/

编辑:

这是正则表达式的细分

var reURLInformation = new RegExp([
    '^(https?:)//', // protocol
    '(([^:/?#]*)(?::([0-9]+))?)', // host (hostname and port)
    '(/{0,1}[^?#]*)', // pathname
    '(\\?[^#]*|)', // search
    '(#.*|)$' // hash
].join(''));
var match = href.match(reURLInformation);
不适用于任何相对 URL。您在制作正则表达式时是否遵循了 RFC-3986?> getLocation("//example.com/"); null > getLocation("/pathname/?search"); null > getLocation("/路径名/"); null > getLocation("相对"); 空值
2021-03-11 05:00:46
添加带有原始 url 的 href 键,这提供了该返回对象与 dom 实现的一致性。
2021-03-21 05:00:46
如果有人需要解析相对 URL,这里是更新的正则表达式: /^(?:(https?\:)\/\/)?(([^:\/?#]*)(?:\:([0 -9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/
2021-03-24 05:00:46
我喜欢这不使用 DOM 的方式,但 gregers 有一个很好的观点。如果这可以处理相对路径,那就太好了。它需要使用 window.location(一个 a 元素)来填充空白并添加代码。那样的话,方法就变得虚伪了。除非有替代方案,否则不确定如何完美解决。
2021-03-25 05:00:46
var loc = window.location;  // => "http://example.com:3000/pathname/?search=test#hash"

返回当前网址。

如果您想将自己的字符串作为 url 传递(在 IE11 中不起作用):

var loc = new URL("http://example.com:3000/pathname/?search=test#hash")

然后你可以像这样解析它:

loc.protocol; // => "http:"
loc.host;     // => "example.com:3000"
loc.hostname; // => "example.com"
loc.port;     // => "3000"
loc.pathname; // => "/pathname/"
loc.hash;     // => "#hash"
loc.search;   // => "?search=test"