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

Ответ 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, чтобы сделать еще две вещи:

  1. Захват имени файла, даже если он избежал двойных кавычек. enter image description here

  2. Захватите UTF-8 '' отдельной группой. enter image description here

Это решение ECMAScript.

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