用于从Content-Disposition标头中提取文件名的javascript正则表达式

时间:2014-04-14 07:35:51

标签: javascript regex

Content-disposition header包含可以轻松提取的文件名,但有时它包含双引号,有时没有引号,也可能还有其他一些变体。有人可以编写一个适用于所有情况的正则表达式。

Content-Disposition: attachment; filename=content.txt

以下是一些可能的目标字符串:

attachment; filename=content.txt
attachment; filename*=UTF-8''filename.txt
attachment; filename="EURO rates"; filename*=utf-8''%e2%82%ac%20rates
attachment; filename="omáèka.jpg"
and some other combinations might also be there

6 个答案:

答案 0 :(得分:23)

你可以尝试这种精神:

filename[^;=\n]*=((['"]).*?\2|[^;\n]*)

filename      # match filename, followed by
[^;=\n]*      # anything but a ;, a = or a newline
=
(             # first capturing group
    (['"])    # either single or double quote, put it in capturing group 2
    .*?       # anything up until the first...
    \2        # matching quote (single if we found single, double if we find double)
|             # OR
    [^;\n]*   # anything but a ; or a newline
)

您的文件名位于第一个捕获组:http://regex101.com/r/hJ7tS6

答案 1 :(得分:5)

/filename[^;=\n]*=(?:(\\?['"])(.*?)\1|(?:[^\s]+'.*?')?([^;\n]*))/i

https://regex101.com/r/hJ7tS6/51

修改:您也可以使用此解析器: https://github.com/Rob--W/open-in-browser/blob/master/extension/content-disposition.js

答案 2 :(得分:4)

稍作修改以匹配我的用例(将所有引号和UTF标记剥离)

filename\*?=['"]?(?:UTF-\d['"]*)?([^;\r\n"']*)['"]?;?

https://regex101.com/r/UhCzyI/3

答案 3 :(得分:3)

免责声明:以下答案仅适用于 PCRE (例如Python / PHP),如果您必须使用javascript,请使用Robin的答案。

此修改版的Robin正则表达式删除了引号:

filename[^;\n=]*=(['\"])*(.*)(?(1)\1|)

filename        # match filename, followed by
[^;=\n]*        # anything but a ;, a = or a newline
=
(['"])*         # either single or double quote, put it in capturing group 1
(?:utf-8\'\')?  # removes the utf-8 part from the match
(.*)            # second capturing group, will contain the filename
(?(1)\1|)       # if clause: if first capturing group is not empty,
                # match it again (the quotes), else match nothing

https://regex101.com/r/hJ7tS6/28

文件名位于第二个捕获组中。

答案 4 :(得分:0)

这是我的正则表达式。它适用于Javascript。

filename\*?=((['"])[\s\S]*?\2|[^;\n]*)

我在我的项目中使用了这个。

答案 5 :(得分:0)

filename[^;\n]*=(UTF-\d['"]*)?((['"]).*?[.]$\2|[^;\n]*)?

我已经升级了Robin的解决方案,可以做另外两件事:

  1. 捕获文件名,即使它已转义了双引号。 enter image description here

  2. 将UTF-8''部分捕获为一个单独的组。 enter image description here

这是ECMAScript解决方案。

https://regex101.com/r/7Csdp4/3/