如何在Javascript中提取URL的末尾?

9

我有以下格式的 URL:

serverName/app/image/thumbnail/2012/4/23/1335228884300/bb65efd50ade4b3591dcf7f4c693042b

其中的 serverName 是服务器的域名。

我想编写一个 JavaScript 函数,接受这些 URL 中的任意一个,并返回最后(最右侧)的斜杠分隔字符串。因此,如果将上述 URL 传递给函数,则会返回 "bb65efd50ade4b3591dcf7f4c693042b";

function getImageDirectoryByFullURL(url) {
    // ... Not sure how to define regexp to delimit on forward slashes,
    // or how to start searching from end of string.
}
5个回答

16

将字符串按斜杠符号/分割,弹出最后一个并返回它

function getImageDirectoryByFullURL(url){
    return url.split('/').pop()
}

//a step by step breakdown
function getImageDirectoryByFullURL(url){
    url = url.split('/'); //url = ["serverName","app",...,"bb65efd50ade4b3591dcf7f4c693042b"]
    url = url.pop();      //url = "bb65efd50ade4b3591dcf7f4c693042b"
    return url;           //return "bb65efd50ade4b3591dcf7f4c693042b"
}

这段代码的作用是按照/字符将URL分割并返回两个斜杠之间的值组成的数组,但不包括斜杠本身。由于split()返回的是一个数组,因此我们可以使用pop()弹出最后一个项并将其返回。


好的例子是按照 OP 的需求去做,而不是他认为自己需要什么 :P - Interrobang
我该如何弹出返回数组中的最后一个索引? - IAmYourFaja
@AdamTannon split() 返回一个数组,pop() 可以使用该数组。pop() 返回由 split() 提供的数组中的最后一项,因此是整个函数返回的内容。 - Joseph

6
在这种情况下,substr() 可能split()更快。不确定是否100%正确。
function getImageDirectoryByFullURL(url){
    return url.substr(url.lastIndexOf("/")+1);
}

编辑:我忘记了,您无需传入额外的长度参数。不传入该参数将只得到字符串的末尾的substr,这正是所需的。虽然此解决方案比Joseph的答案丑陋一些,但在Chrome中它要快两倍,在Firefox中大约快五倍。


1
我怀疑速度差异是否足够大以至于有所影响。你的解决方案和Joseph提出的方案都是有效的(尽管我个人更喜欢他的,因为它更简洁和精炼)。 - Sasha Chedygov
1
是的。我只是想提出一种不同的方法来做它,因为...嗯,就是因为。=] - Elliot Bonneville
+1,很好的替代方案,只需在此处添加+1 lastIndexOf("/") + 1 即可删除第一个 / - ajax333221
令人惊讶的是,这比pop解决方案快得多 http://jsperf.com/popvslastindex - ajax333221
1
哇,感谢测试。我本来就怀疑它会更快;只是不知道会快多少。我敢打赌这是因为使用split()解决方案时,你需要创建数组并在其上调用pop()函数的开销,而str.substr()则直接返回所请求的字符串。 - Elliot Bonneville

3
为使其更加健壮,并允许 URL 上可能存在尾部斜杠、哈希标签或查询参数:
function getImageDirectoryByFullURL(url){
    url = url.replace(/#[^#]+$/, "").replace(/\?[^\?]+$/, "").replace(/\/$/, "");
    return url.substr(url.lastIndexOf("/") + 1);
}

以下是一个带有多个测试用例的演示: http://jsfiddle.net/jfriend00/akVVf/


@ElliotBonneville— 对于荒谬的+1,我点赞。;-) - RobG
我不确定为什么你认为正则表达式很荒谬。/#[^#]+$/匹配从最后一个#到字符串末尾的内容。同样,/\?[^\?]+$/也是以?结尾的匹配。 - jfriend00

1

由于没有合理的正则表达式版本,请考虑以下方法:

return url.replace(/^.*\//,'');

最好希望URL结尾没有斜杠。 - jfriend00
OP可以进行排序,要求是“...最后一个(最右边的)斜杠分隔的字符串”。 - RobG

0

你也可以尝试像这样做,得到相同的结果。

function getImageUrl( url){
    var result = url.substring(url.lastIndexOf("/") + 1);
    return result;
}

请查看我的答案;同时请记住,Javascript函数是区分大小写的(LastIndexOf 应该是 lastIndexOf),而且你需要使用 lastIndexOf("/") + 1 来避免包含字符串开头的额外 "/"。 - Elliot Bonneville

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接