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

使用正则表达式或Javascript从URL获取文件名,javascript,regex,url,filenames,Javascript,Regex,Url,Filenames,我需要从URL地址获取文件名 标准如下: 在以下情况下,它需要返回空字符串“”: http://somedomain.com http://www.somedomain.com http://somedomain.com/ http://www.somedomain.com/ http://somedomain.com/filename.php?query http://www.somedomain.com/filename.php?query http://somedomain.com/fi

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

标准如下:

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

http://somedomain.com
http://www.somedomain.com
http://somedomain.com/
http://www.somedomain.com/
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
并在以下情况下返回filename.php:

http://somedomain.com
http://www.somedomain.com
http://somedomain.com/
http://www.somedomain.com/
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\.-]*$
from

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

如果正则表达式很难使用,我也会很欣赏JavaScript解决方案


提前使用Thanx。

使用这个经过调整的Reg ex版本:(添加\/到现有版本中)


这将把文件名放在
$1
[^::+://[^/]+/?([^?#]*)


(p.s.是您进行此类测试的朋友)

假设您在浏览器中编写脚本,那么已经有一个功能齐全的URL解析器供您利用,而无需编写不可靠的不完整正则表达式。使用HTMLanchoreElement读取
位置
-如属性
主机
路径名
搜索
哈希
等:

var a= document.createElement('a');
a.href= 'http://somedomain.com/dirname/filename.php?query';
var filename= a.pathname.split('/').pop(); // filename.php
split(/[\?]/)
regex对“\\”或“?”的输入。
shift()
从拆分的输入中取出“最左边”的元素。
split('/')
在每个斜杠上拆分此元素并返回一个数组。
pop()
数组中作为文件名的“最顶端”元素。
slice(-3)
从文件名中去掉最后三个字符以进行检查。
'php'?文件名:“
“php”返回文件名,否则返回空字符串


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

谢谢。这很好,但是我最终使用了bobince的解决方案。我认为它更简单。请在你的答案中添加一个解释,而不仅仅是代码本身。虽然这段代码片段可能是解决方案,但确实有助于提高你文章的质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码建议的原因。比您!这个时间更短了。现在也解释一下。但我无法解释为什么我遗漏了这个解释:PInteresting数组上的函数如何更改数组,但string上的函数不更改字符串,而是返回字符串的新更改。所以slice将保留文件名。但是x在每一步都会改变,你实际上可以把这些部分存储在变量中。