用于从内容处置头提取文件名的javascript正则表达式

用于从内容处置头提取文件名的javascript正则表达式,javascript,regex,Javascript,Regex,Content disposition标头包含易于提取的文件名,但有时它包含双引号,有时不包含引号,并且可能还有其他一些变体。有人能写一个在所有情况下都有效的正则表达式吗 Content-Disposition: attachment; filename=content.txt 以下是一些可能的目标字符串: attachment; filename=content.txt attachment; filename*=UTF-8''filename.txt attachment; filenam

Content disposition标头包含易于提取的文件名,但有时它包含双引号,有时不包含引号,并且可能还有其他一些变体。有人能写一个在所有情况下都有效的正则表达式吗

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

你可以本着这种精神尝试一下:

filename[^;=\n]*=((['“]).*?\2[^;\n]*)
文件名#匹配文件名,后跟
[^;=\n]*#除a;、a=或换行符以外的任何内容
=
(#第一捕获组
(['”)#单引号或双引号,将其放入第2组
。*?#在第一次。。。
\2#匹配报价(如果我们找到单,则为单,如果我们找到双,则为双)
|#或
[^;\n]*#除了一个;或一个新行以外的任何东西
)

您的文件名位于第一个捕获组中:

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


Robin的正则表达式的这个修改版本去掉了引号:

filename[^;\n=]*=(['\“])*(.*)(?(1)\1 |)
文件名#匹配文件名,后跟
[^;=\n]*#除a;、a=或换行符以外的任何内容
=
(['“])*#单引号或双引号,将其放在捕获组1中
(?:utf-8\'\'))?#从匹配中删除utf-8零件
(*)#第二个捕获组将包含文件名
(?(1)\1 |)#if子句:如果第一个捕获组不是空的,
#再次匹配它(引号),否则不匹配任何内容


文件名在第二个捕获组中。

这是我的正则表达式。它在Javascript上工作

filename\*?=((['"])[\s\S]*?\2|[^;\n]*)
我在我的项目中使用了这个

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

编辑:您也可以使用此解析器:

稍微修改以匹配我的用例(去掉所有引号和UTF标记)

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

我升级了Robin的解决方案,以完成另外两件事:

  • 捕获文件名,即使它已转义双引号。

  • 将UTF-8''部件捕获为单独的组。

  • 这是一个ECMAScript解决方案


    匹配的字符串不应包含双引号和“utf-8”@adnankamili:最简单的解决方案可能是在与正则表达式分开后执行此检查。/文件名[^;=\n]*=(([''''])..\2.[^;\n]*)/.exec(contentDisposition)[1]文件名[^;=\n]*=(?:(\\\?[''])(?:[^.+++++'''..-)(?:[^;\n].*))这需要一个PCRE风格的regex OP,用于JS。@miqid yep,很抱歉我编辑了我的答案。不过我当时使用的是python,所以我认为我的版本可以被看作是解决问题的一般解决方案,对于我们这些不使用javascript.res=re.search(r“filename[^;\n=*=(['\']])*(.*)((?(1)\1\\\')”,string)res.group(2)我已经修改了您的正则表达式,允许在=之后和名称之前使用空格:
    filename[^;\n]*=\s*(UTF-\d['''']*)?)((['])。]$\2 |[^;\n]*)?
    如果文件名包含以下内容,则失败
    filename[^;\n]*=(UTF-\d['"]*)?((['"]).*?[.]$\2|[^;\n]*)?