JavaScript-获取部分URL路径


Answers:


425

内置window.location对象的属性将为当前窗口提供该属性。

// If URL is http://www.somedomain.com/account/search?filter=a#top

window.location.pathname // /account/search

// For reference:

window.location.host     // www.somedomain.com (includes port if there is one)
window.location.hostname // www.somedomain.com
window.location.hash     // #top
window.location.href     // http://www.somedomain.com/account/search?filter=a#top
window.location.port     // (empty string)
window.location.protocol // http:
window.location.search   // ?filter=a  


更新,对任何URL使用相同的属性:

事实证明,此模式已被标准化为称为URLUtils的接口,您猜怎么着?现有window.location对象和锚元素均实现该接口。

因此,您可以对任何 URL 使用与上面相同的属性 -只需使用URL创建锚并访问属性:

var el = document.createElement('a');
el.href = "http://www.somedomain.com/account/search?filter=a#top";

el.host        // www.somedomain.com (includes port if there is one[1])
el.hostname    // www.somedomain.com
el.hash        // #top
el.href        // http://www.somedomain.com/account/search?filter=a#top
el.pathname    // /account/search
el.port        // (port if there is one[1])
el.protocol    // http:
el.search      // ?filter=a

[1]:浏览器对包含端口的属性的支持不一致,请参见:http : //jessepollak.me/chrome-was-wrong-ie-was-right

这可以在最新版本的Chrome和Firefox中使用。我没有要测试的Internet Explorer版本,因此请使用JSFiddle示例进行测试。

JSFiddle示例

还有一个即将到来的URL对象,它将在没有锚元素的情况下为URL本身提供这种支持。目前似乎尚无稳定的浏览器支持它,但据说它已在Firefox 26中提供。 当您认为自己可能会支持它时,请在此处尝试


OP要求输入“ URL”,而不是“窗口的当前URL”。如果您使用网址作为字符串怎么办?
2013年

2
@JoshNoe原来,您现在可以在锚元素上使用相同的属性。查看更新后的答案。
妮可

感谢您提供的信息。我使用IE 9和IE 8(使用IE 9进行模拟)进行了测试。当然可以使用最新版本的Chrome和Firefox :)
2014年

49
window.location.href.split('/');

将为您提供一个包含所有URL部分的数组,您可以像访问普通数组一样进行访问。

或@Dylan建议的更优雅的解决方案,仅包含路径部分:

window.location.pathname.split('/');

2
window.location.pathname.split('/'); 如果您尝试在标准协议和www等之外访问URL的不同部分,则在大多数情况下是一个更优雅的解决方案。–
Dylan

1
window.location.pathname.split('/')。filter(function(v){return v;}); 将删除Javascript 1.6及更高版本的空元素。
Dhaval Desai

28

如果这是当前 URL,请使用window.location.pathname,否则请使用以下正则表达式:

var reg = /.+?\:\/\/.+?(\/.+?)(?:#|\?|$)/;
var pathname = reg.exec( 'http://www.somedomain.com/account/search?filter=a#top' )[1];

几乎完美-但与window.location.pathname不同,它在Windows的路径名中不包含驱动器号。
Theo

1
对于即使没有路径名也可以使用的正则表达式,请使用:/.+?\:\/\/.+?(\/.+?)?(?:#|\?|)?$/
Scottmas

3

有一个有用的Web API方法称为URL

const url = new URL('http://www.somedomain.com/account/search?filter=a#top');
console.log(url.pathname.split('/'));
const params = new URLSearchParams(url.search)
console.log(params.get("filter"))


0

如果您想获取已存储在变量中的URL的一部分,我建议您使用URL-Parse

const Url = require('url-parse');
const url = new Url('https://github.com/foo/bar');

根据文档,它提取了以下部分:

返回的url实例包含以下属性:

protocol:URL的协议方案(例如,http :)。斜杠:布尔值,指示协议后是否跟随两个正斜杠(//)。auth:身份验证信息部分(例如,用户名:password)。username:基本认证的用户名。password:基本认证密码。host:带有端口号的主机名。hostname:不带端口号的主机名。port:可选端口号。pathname:URL路径。query:包含查询字符串的已解析对象,除非将解析设置为false。哈希:URL的“片段”部分,包括井号(#)。href:完整的URL。origin:URL的来源。


0

如果您有一个抽象的URL字符串(不是当前字符串window.location),则可以使用以下技巧:

let yourUrlString = "http://example.com:3000/pathname/?search=test#hash";

let parser = document.createElement('a');
parser.href = yourUrlString;

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

感谢jlong

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.