我正在尝试编写一个正则表达式,以便从URL中获取文件名(如果存在)。
这是我到目前为止所做的:
(?:[^/][\d\w\.]+)+$
因此,从网址http://www.foo.com/bar/baz/filename.jpg
开始,我应该匹配filename.jpg
不幸的是,我在最后/
之后匹配任何内容。
如何将其收紧,以便只有在看起来像文件名时才能抓住它?
答案 0 :(得分:20)
以上示例无法获取文件名" file-1.name.zip"来自此网址:
"http://sub.domain.com/sub/sub/handler?file=data/file-1.name.zip&v=1"
所以我创建了我的REGEX版本:
[^/\\&\?]+\.\w{3,4}(?=([\?&].*$|$))
说明:
[^/\\&\?]+ # file name - group of chars without URL delimiters
\.\w{3,4} # file extension - 3 or 4 word chars
(?=([\?&].*$|$)) # positive lookahead to ensure that file name is at the end of string or there is some QueryString parameters, that needs to be ignored
答案 1 :(得分:13)
这个适合我。
(\w+)(\.\w+)+(?!.*(\w+)(\.\w+)+)
答案 2 :(得分:8)
(?:.+\/)(.+)
选择所有直到最后一个正斜杠(/),捕获此正斜杠后的所有内容。使用子模式$ 1.
答案 3 :(得分:5)
非Pcre
(?:[^/][\d\w\.]+)$(?<=\.\w{3,4})
PCRE
(?:[^/][\d\w\.]+)$(?<=(?:.jpg)|(?:.pdf)|(?:.gif)|(?:.jpeg)|(more_extension))
由于您使用基于javascript的regexpal.com
进行测试(不支持lookbehind),请尝试使用
(?=\w+\.\w{3,4}$).+
答案 4 :(得分:0)
它可能也有效:
(\w+\.)+\w+$
答案 5 :(得分:0)
你知道你的分隔符是什么样的,所以你不需要正则表达式。只需split
字符串。由于你没有提到语言,这里是Perl中的一个实现:
use strict;
use warnings;
my $url = "http://www.foo.com/bar/baz/filename.jpg";
my @url_parts = split/\//,$url;
my $filename = $url_parts[-1];
if(index($filename,".") > 0 )
{
print "It appears as though we have a filename of $filename.\n";
}
else
{
print "It seems as though the end of the URL ($filename) is not a filename.\n";
}
当然,如果您需要担心特定的文件扩展名(png,jpg,html等),请进行适当的调整。
答案 6 :(得分:0)
> echo "http://www.foo.com/bar/baz/filename.jpg" | sed 's/.*\/\([^\/]*\..*\)$/\1/g'
filename.jpg
答案 7 :(得分:0)
假设您将使用javascript:
var fn=window.location.href.match(/([^/])+/g);
fn = fn[fn.length-1]; // get the last element of the array
alert(fn.substring(0,fn.indexOf('.')));//alerts the filename
答案 8 :(得分:0)
以下是您可能使用的代码:
\/([\w.][\w.-]*)(?<!\/\.)(?<!\/\.\.)(?:\?.*)?$
命名“。”和“ ..”不正常。
您可以在https://regex101.com/r/QaAK06/1/上使用此正则表达式:
答案 9 :(得分:0)
我正在使用这个
(?<=\/)[^\/\?#]+(?=[^\/]*$)
说明:
(?<=):正面看,断言字符串具有此表达式,但不匹配。
(?<= /):对正斜杠“ /”的正向查找,表示我正在寻找一个在前但与正斜杠不匹配的表达式。
[^ / \?#] +:一个或多个不是“ /”,“?”的字符或“#”,剥离搜索参数和哈希。
(?= [^ /] * $):积极寻找不匹配斜线的任何内容,然后匹配行尾。这是为了确保选择了最后一个正斜杠段。
用法示例:
const urlFileNameRegEx = /(?<=\/)[^\/\?#]+(?=[^\/]*$)/;
const testCases = [
"https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit#yo",
"https://developer.mozilla.org/static/fonts/locales/ZillaSlab-Regular.subset.bbc33fb47cf6.woff2",
"https://developer.mozilla.org/static/build/styles/locale-en-US.520ecdcaef8c.css?is-nice=true"
];
testCases.forEach(testStr => console.log(`The file of ${testStr} is ${urlFileNameRegEx.exec(testStr)[0]}`))
答案 10 :(得分:0)
如果您使用的是 JavaScript URL object,您可以将路径名与以下 RegExp 结合使用:
.*\/(.[^(\/)]+)
它匹配路径末尾的任何内容,但排除可能的尾部斜杠(只要没有两个尾部斜杠)!
答案 11 :(得分:0)
这对我有用,不管你有没有'.'或不带“.”它需要url的后缀
\/(\w+)[\.|\w]+$
答案 12 :(得分:-1)
试试这个:
(?:[^/]*+)$(?<=\..*)