我需要从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解决方案。
提前完成。
答案 0 :(得分:20)
假设您正在浏览器中编写脚本,那么您已经拥有了一个功能齐全的URL解析器,您可以利用它,而无需编写不可靠的不完整regexen。使用HTMLAnchorElement来阅读location
- 类似的属性host
,pathname
,search
,hash
等:
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中的'\?
'被转义为字符而不是正则表达式运算符。