Javascript regex для извлечения имени файла из заголовка Content-Disposition
Заголовок 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
Ответы
Ответ 1
Вы могли бы попробовать что-то в этом духе:
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
Ответ 2
Слегка изменено в соответствии с моим вариантом использования (удаляет все кавычки и теги UTF)
filename\*?=['"]?(?:UTF-\d['"]*)?([^;\r\n"']*)['"]?;?
https://regex101.com/r/UhCzyI/3
Ответ 3
/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
Ответ 4
Отказ от ответственности: следующий ответ работает только с 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
Имя файла находится во второй группе захвата.
Ответ 5
Вот мое регулярное выражение. Он работает на Javascript.
filename\*?=((['"])[\s\S]*?\2|[^;\n]*)
Я использовал это в своем проекте.
Ответ 6
filename[^;\n]*=(UTF-\d['"]*)?((['"]).*?[.]$\2|[^;\n]*)?
Я обновил решение Robins, чтобы сделать еще две вещи:
Захват имени файла, даже если он избежал двойных кавычек.
![enter image description here]()
Захватите UTF-8 '' отдельной группой.
![enter image description here]()
Это решение ECMAScript.
https://regex101.com/r/7Csdp4/3/