Я пытаюсь понять этот оператор RegEx в деталях. Это, как предполагается, проверяет имя файла от управления ASP.Net FileUpload для разрешения только jpeg и gif файлы. Это было разработано кем-то еще, и я не полностью понимаю это. Это хорошо работает в Internet Explorer 7.0, но не в Firefox 3.6.
<asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server"
ErrorMessage="Upload Jpegs and Gifs only."
ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)$"
ControlToValidate="LogoFileUpload">
</asp:RegularExpressionValidator>
Это неправильное регулярное выражение.
^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)$
Давайте сделаем это по частям.
([a-zA-Z]:)
Это требует, чтобы путь к файлу начинался с буквы диска, например C:
, d:
и т. Д.
(\\{2}\w+)\$?)
\\ {2}
означает, что обратная косая черта повторяется дважды ( обратите внимание, что \
необходимо экранировать), за которым следует несколько буквенно-цифровых символов ( \ w +
), а затем, возможно, знак доллара ( \ $?
). Это хост-часть пути UNC.
([a-zA-Z]:)|(\\{2}\w+)\$?)
|
означает «или». Так что либо начинается с буквы диска, либо с пути UNC. Поздравляем с удалением пользователей, отличных от Windows.
(\\(\w[\w].*))
Это должна быть часть пути каталога, но на самом деле это 2 буквенно-цифровых символа, за которыми следует что-либо, кроме новых строк (. *
), например \ ab! @ # * (# $ *)
.
Правильное регулярное выражение для этой части должно быть (?: \\\ w +) +
(.jpg|.JPG|.gif|.GIF)$
Это означает, что последние 3 символа пути должны быть jpg
, JPG
, gif
или GIF
. Обратите внимание, что .
- это не точка, но соответствует чему угодно, кроме \ n
, поэтому имя файла, например haha.abcgif
или malware.exe \ 0gif
пройдет.
Правильное регулярное выражение для этой части должно быть \. (?: jpg | JPG | gif | GIF) $
Вместе
^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)$
будет соответствовать
D:\foo.jpg
\\remote$\dummy\..\C:\Windows\System32\Logo.gif
C:\Windows\System32\cmd.exe;--gif
и не удастся
/home/user/pictures/myself.jpg
C:\a.jpg
C:\d\e.jpg
Правильное регулярное выражение это / \. (?: jpg | gif) $ / i
, и проверьте, действительно ли загруженный файл является изображением на стороне сервера .
Вот краткое объяснение:
^ # match the beginning of the input
( # start capture group 1
( # start capture group 2
[a-zA-Z] # match any character from the set {'A'..'Z', 'a'..'z'}
: # match the character ':'
) # end capture group 2
| # OR
( # start capture group 3
\\{2} # match the character '\' and repeat it exactly 2 times
\w+ # match a word character: [a-zA-Z_0-9] and repeat it one or more times
) # end capture group 3
\$? # match the character '$' and match it once or none at all
) # end capture group 1
( # start capture group 4
\\ # match the character '\'
( # start capture group 5
\w # match a word character: [a-zA-Z_0-9]
[\w] # match any character from the set {'0'..'9', 'A'..'Z', '_', 'a'..'z'}
.* # match any character except line breaks and repeat it zero or more times
) # end capture group 5
) # end capture group 4
( # start capture group 6
. # match any character except line breaks
jpg # match the characters 'jpg'
| # OR
. # match any character except line breaks
JPG # match the characters 'JPG'
| # OR
. # match any character except line breaks
gif # match the characters 'gif'
| # OR
. # match any character except line breaks
GIF # match the characters 'GIF'
) # end capture group 6
$ # match the end of the input
РЕДАКТИРОВАТЬ
Как и некоторые из запросов комментариев, приведенное выше генерируется небольшим инструментом, который я написал. Вы можете скачать здесь: http://www.big-o.nl/apps/pcreparser/pcre/PCREParser.html (ВНИМАНИЕ: находится в стадии разработки!)
РЕДАКТИРОВАТЬ 2
Он будет соответствовать следующим строкам:
x:\abc\def\ghi.JPG
c:\foo\bar.gif
\\foo$\baz.jpg
Вот то, что группы 1, 4 и 6 соответствуют индивидуально:
group 1 | group 4 | group 6
--------+--------------+--------
| |
x: | \abc\def\ghi | .JPG
| |
c: | \foo\bar | .gif
| |
\\foo$ | \baz | .jpg
| |
Обратите внимание, что это также соответствует строка вида c: \ foo \ bar @ gif
, поскольку DOT соответствует любому символу (кроме разрывов строки). И он отклонит строку типа c: \ foo \ bar.Gif
(заглавная G
в gif
).
Он разделяет имя файла на части: букву диска, путь, имя файла и расширение.
Скорее всего, IE использует обратные слеши, а FireFox - слеши. Попробуйте заменить части \\\ на [\\\/], чтобы выражение принимало и слеши, и обратные слеши.
От Expresso вот что говорит Expresso:
/// A description of the regular expression: /// /// Beginning of line or string /// [1]: A numbered capture group. [([a-zA-Z]:)|(\\{2}\w+)\$?] /// Select from 2 alternatives /// [2]: A numbered capture group. [[a-zA-Z]:] /// [a-zA-Z]: /// Any character in this class: [a-zA-Z] /// : /// (\\{2}\w+)\$? /// [3]: A numbered capture group. [\\{2}\w+] /// \\{2}\w+ /// Literal \, exactly 2 repetitions /// Alphanumeric, one or more repetitions /// Literal $, zero or one repetitions /// [4]: A numbered capture group. [\\(\w[\w].*)] /// \\(\w[\w].*) /// Literal \ /// [5]: A numbered capture group. [\w[\w].*] /// \w[\w].* /// Alphanumeric /// Any character in this class: [\w] /// Any character, any number of repetitions /// [6]: A numbered capture group. [.jpg|.JPG|.gif|.GIF] /// Select from 4 alternatives /// .jpg /// Any character /// jpg /// .JPG /// Any character /// JPG /// .gif /// Any character /// gif /// .GIF /// Any character /// GIF /// End of line or string ///
Надеюсь, это поможет, С уважением, Том.
Возможно, вам потребуется реализовать валидацию на стороне сервера. Посмотрите эту статью.
Решение проблем валидации ASP.NET
Также есть несколько хороших онлайн-инструментов для создания или интерпретации выражений Regex. но я подозреваю, что проблема не в выражении.