使用正则表达式或Javascript从URL中获取文件名

6

我需要从URL地址中获取文件名。

以下是要求:

在以下情况下,它需要返回空字符串""

http://somedomain.com
http://www.somedomain.com
http://somedomain.com/
http://www.somedomain.com/

在以下情况下返回filename.php:
http://somedomain.com/filename.php?query
http://www.somedomain.com/filename.php?query
http://somedomain.com/filename.php#query
http://www.somedomain.com/filename.php#query

我发现了这个正则表达式:

[\w_.-]*?(?=[\?\#])|[\w_.-]*$,来自这里

但是,在输入http://somedomain.com时,它会返回somedomain.com。我不知道如何修改它,以便在域名末尾没有/的情况下忽略域名。

如果使用正则表达式很难实现,我也会感激JavaScript解决方案。

提前感谢。

4个回答

19

假设你正在浏览器中编写脚本,那么已经有一个功能完备的URL解析器供你利用,无需编写不可靠不完整的正则表达式。使用HTMLAnchorElement来读取类似于location的属性,如hostpathnamesearchhash等:

var a= document.createElement('a');
a.href= 'http://somedomain.com/dirname/filename.php?query';
var filename= a.pathname.split('/').pop(); // filename.php

3

谢谢。这个很好用,不过最终我使用了bobince的解决方案。我认为它更简单。 - miki725

0
function returnPHPname(x) {
    var fileName = x.split(/[#\?]/).shift().split('/').pop()
    return fileName.slice(-3) == 'php'? fileName: ""
}

split(/[#\?]/) 使用正则表达式{{link2:字符类在'#'或'?'处分割输入。
shift() {{link3:从分割后的输入中取出最左边的元素。
split('/') {{link4:将该元素按照斜杠分割并返回一个数组。
pop() {{link5:将数组中最上面的元素作为文件名。
slice(-3) {{link6:从文件名中截取三个字符以进行检查。
'php'? fileName: "" 如果'php'返回文件名,否则返回空字符串。

请注意,在正则表达式中的'\?'被转义为字符,而不是正则表达式运算符。

1
请在您的答案中添加解释,而不仅仅是代码本身。 - Deiv
2
虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您的代码建议的原因。 - nircraft
谢谢!这变得更短了。现在还有解释。但我不知道为什么我省略了解释 :P - user985399
有趣的是,对数组进行的函数会改变数组本身,但对字符串进行的函数则不会改变字符串,而是返回一个新的字符串更改。因此,slice 将保留文件名,但 x 在每个步骤中都会更改,实际上您可以将这些部分存储在变量中。 - user985399

0
使用这个调整过的正则表达式版本:(在现有的基础上添加了 \/)
[\w_.-]*?(?=[\/\?\#])|[\w_.-]*$

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