Перевірка типів файлів регулярним виразом


79

У мене є веб-форма .NET, яка має елемент керування завантаженням файлів, прив’язаний до валідатора регулярних виразів. Цей валідатор повинен перевірити, що для завантаження мають бути дозволені лише певні типи файлів (jpg, gif, doc, pdf)

Поточний регулярний вираз, який робить це:


^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF|.doc|.DOC|.pdf|.PDF)$

Однак це, здається, не працює ... чи може хто-небудь надати мені невелику допомогу, колишню допомогу?


18
Я впевнений, ви це знаєте, але на випадок, якщо хтось пізніше знайде це питання, а хто цього не знає: Цей метод перевірить лише розширення файлу, а не його фактичний тип. Отримавши файл, ви повинні вивчити його вміст, щоб визначити, яким він є насправді. Якщо ви покладаєтеся на назву, це величезна вада безпеки.
Dave Sherohman

Відповіді:


169

На мій погляд, ваш регулярний вираз здається занадто складним. Також пам’ятайте, що крапка - це спеціальний символ, що означає «будь-який символ». Наступний регулярний вираз повинен працювати (зверніть увагу на екрановані крапки):

^.*\.(jpg|JPG|gif|GIF|doc|DOC|pdf|PDF)$

Ви можете використовувати такий інструмент, як Expresso, щоб перевірити свої регулярні вирази.


При виконанні регулярних виразів у .NET перерахування відмінностей між регістром не потрібно. Це не тільки може знизити читабельність, але також може погіршити продуктивність, якщо її викликати в циклі, наприклад.
Джозеф Ферріс,

2
Проблема полягає в тому, що регулярний вираз використовується в елементі управління RegularExpressionValidator ASP.NET, який AFAIK не приймає такі опції, як IgnoreCase.
Даріо Солера

Я пропустив це в оригінальній публікації. Так, параметри чутливості до регістру RegularExpressionValidator - це те, що Microsoft вже кілька років ігнорує прохання широкого загалу.
Джозеф Ферріс

1
Ви можете пропустити ^. *, Оскільки "збігатися з чим-небудь від початку і до цього виразу в кінці" - це те саме, що "збігатися з цим виразом в кінці". Ви також можете вбудувати параметри регулярних виразів msdn.microsoft.com/en-us/library/yd1hzczs.aspx
ICR

Для того, щоб вбудувати параметр регулярного виразу, щоб ігнорувати регістр, вам потрібно вимкнути скрипт ClientSide (я не думаю, що JavaScript його підтримує). Потім ви можете використовувати використання "(? I:. (Jpg | gif | doc | pdf)) $" для збігу регістру, що не чує.
Martin Brown

19
^.+\.(?:(?:[dD][oO][cC][xX]?)|(?:[pP][dD][fF]))$

Приймає файли .doc, .docx, .pdf, що мають ім’я щонайменше одного символу:

^           = beginning of string
.+          = at least one character (any character)
\.          = dot ('.')
(?:pattern) = match the pattern without storing the match)
[dD]        = any character in the set ('d' or 'D')
[xX]?       = any character in the set or none 
              ('x' may be missing so 'doc' or 'docx' are both accepted)
|           = either the previous or the next pattern
$           = end of matched string

Увага! Без укладання цілого ланцюжка розширень у (? :), таке розширення, як .docpdf, пройде.

Ви можете протестувати регулярні вирази на веб- сайті http://www.regextester.com/


16

Ви просто хочете перевірити, чи файл має вказане розширення? Ви можете спростити те, що ви намагаєтеся зробити, приблизно таким чином:

(.*?)\.(jpg|gif|doc|pdf)$

Потім, коли ви викликаєте IsMatch (), обов’язково передайте RegexOptions.IgnoreCase як другий параметр. Немає жодних причин перераховувати варіанти кожуха.

Редагувати: Як згадує Даріо, це не буде працювати для RegularExpressionValidator, оскільки він не підтримує опцій кожуха.


1
Це дозволяє додавати крапки до імені файлу, що для мене добре
Бронек,

12

Ви можете вбудувати нечутливість до регістру в регулярний вираз так:

\.(?i:)(?:jpg|gif|doc|pdf)$

1
За винятком того, що це не вдається, якщо ви залишаєте опцію сценарію клієнта увімкненою.
Martin Brown

JavaScript Afaik дійсно дозволяє вбудовані параметри, але це стосується всього регулярного виразу, а не лише всього після нього, що в цьому випадку не має значення. Якщо немає іншої причини, що це не спрацює (я не можу перевірити банкомат).
ICR

2
Ні, JS взагалі не підтримує вбудовані модифікатори. Крім того, ваш регулярний вираз не працюватиме навіть у .NET; ви хочете або "\. (? i) (?: jpg | gif | doc | pdf) $" або "\. (? i: jpg | gif | doc | pdf) $". Це: "(? I :)" просто нічого не відповідає, без урахування регістру.
Алан Мур,

6

Ви можете використовувати цей шаблон для кожного типу файлу:

ValidationExpression="^.+\.(([pP][dD][fF])|([jJ][pP][gG])|([pP][nN][gG])))$"

наприклад: ви можете додати ( [rR][aA][rR]) для типу файлу Rar та ін ...


5

Здається, ваш регулярний вираз перевіряє як ім'я файлу, так і розширення. Це те, що вам потрібно? Я припускаю, що це просто розширення і використовуватиме такий регулярний вираз:

\.(jpg|gif|doc|pdf)$

І встановіть відповідність як чутливу до регістру.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.