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

时间:2010-12-28 21:26:47

标签: javascript regex url filenames

我需要从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

我找到了这个正则表达式

来自here

[\w_.-]*?(?=[\?\#])|[\w_.-]*$

然而,它会在输入somedomain.com上返回http://somedomain.com。在最后没有/时,我无法弄清楚如何修改它以忽略域。

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

提前完成。

4 个答案:

答案 0 :(得分:20)

假设您正在浏览器中编写脚本,那么您已经拥有了一个功能齐全的URL解析器,您可以利用它,而无需编写不可靠的不完整regexen。使用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

答案 1 :(得分:3)

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

(p。http://rentzsch.github.com/JSRegexTeststand/是你进行此类测试的朋友)

答案 2 :(得分:0)

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

[\w_.-]*?(?=[\/\?\#])|[\w_.-]*$

答案 3 :(得分:0)

function returnPHPname(x) {
    var fileName = x.split(/[#\?]/).shift().split('/').pop()
    return fileName.slice(-3) == 'php'? fileName: ""
}
在“#”或“?”上输入

split(/[#\?]/) split由正则表达式character class
shift() shift从拆分输入中移出“最左侧”元素。
在每个斜杠上split('/') split并返回一个数组。
pop() pop数组的“最高”元素作为文件名。
slice(-3) slice关闭文件名中的最后三个字符以进行检查。.
'php'? fileName: ""'php'返回文件名,否则返回空字符串。

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