我使用一个Javascript正则表达式来提取"文件名";来自Content Disposition HTTP标头。
内容处置值的一个示例是:
attachment; filename="myFile.pdf"
在某些情况下,服务器不会用引号括起文件名:
attachment; filename=myFile.pdf
情况1(正常(:
var contentDisposition = "attachment; filename=myFile.pdf" // get Content-Disposition from HTTP Header
const fileNameMatch = contentDisposition.match(/filename="?(.+)"?/);
const fileName = fileNameMatch[1];
console.log(fileName); // Expected: myFile.pdf - Actual: myFile.pdf
案例2(KO(:
var contentDisposition = "attachment; filename="myFile.pdf"" // get Content-Disposition from HTTP Header
const fileNameMatch = contentDisposition.match(/filename="?(.+)"?/);
const fileName = fileNameMatch[1];
console.log(fileName); // Expected: myFile.pdf - Actual: myFile.pdf"
在情况2中,预期结果为:myFile.pdf
而实际:myFile.pdf"
(最后一个报价未删除(
如何修复正则表达式以使案例2正常工作?
非贪婪+?
在可选的、尝试显式类[^"]
:之前不起作用
re = /filename="?([^"]+)"?/
contentDisposition = `attachment; filename="myFile.pdf"`
console.log(contentDisposition.match(re)[1])
contentDisposition = `attachment; filename=myFile.pdf`
console.log(contentDisposition.match(re)[1])
另一个(也许更好的(选择是锚定整个事情:
re = /filename="?(.+?)"?$/
s = `attachment; filename="myFile.pdf"`
console.log(s.match(re)[1])
s = `attachment; filename=myFile.pdf`
console.log(s.match(re)[1])
您可以使用一个捕获组将可选的"
与backreference匹配,以匹配双引号,并从组2中获取值。
bfilename=("?)([^"rn]+)1
模式匹配:
bfilename=
匹配前面的单词边界("?)
捕获组1,可选匹配"
([^"rn]+)
捕获组2,匹配除:
或换行符之外的任何字符的1+倍1
Backreference与组1匹配
Regex演示
var contentDisposition = "attachment; filename="myFile.pdf"" // get Content-Disposition from HTTP Header
const fileNameMatch = contentDisposition.match(/bfilename=("?)([^"rn]+)1/);
const fileName = fileNameMatch[2];
console.log(fileName);
使用正则表达式解析HTTP字段值很棘手。
要想做得好,您必须考虑更多的边缘情况,例如字符串中的转义引号。