正则表达式从网址获取文件名

时间:2013-01-23 05:40:50

标签: regex

我正在尝试编写一个正则表达式,以便从URL中获取文件名(如果存在)。

这是我到目前为止所做的:

(?:[^/][\d\w\.]+)+$

因此,从网址http://www.foo.com/bar/baz/filename.jpg开始,我应该匹配filename.jpg

不幸的是,我在最后/之后匹配任何内容。

如何将其收紧,以便只有在看起来像文件名时才能抓住它?

13 个答案:

答案 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))

Demo

由于您使用基于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)

试试这个:

(?:[^/]*+)$(?<=\..*)