我使用javascript正则表达式从内容处置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"
(最后一个报价未删除)
如何修复正则表达式以使case2正常工作?
3条答案
按热度按时间jfgube3f1#
非贪婪
+?
在可选类之前不起作用,请尝试显式类[^"]
:另一个(或许更好)选择是锚定整个事件:
umuewwlo2#
您可以使用与可选配置匹配的捕获组
"
使用反向引用与双引号匹配,并从组2获取值。模式匹配:
\bfilename=
以单词边界开头的字面匹配("?)
捕获组1,可选匹配"
([^"\r\n]+)
捕获组2,匹配任何字符的1+倍,除了:
还是新线\1
反向引用以与组1相同正则表达式演示
mbyulnm03#
使用正则表达式解析http字段值很棘手。
要正确处理,你必须考虑更多的边缘情况,比如字符串中的逃出引用。