Поймите этот оператор RegEx

Я пытаюсь понять этот оператор 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>
6
задан Benjamin 19 February 2014 в 16:25
поделиться

5 ответов

Это неправильное регулярное выражение.

^(([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 , и проверьте, действительно ли загруженный файл является изображением на стороне сервера .

4
ответ дан 8 December 2019 в 17:21
поделиться

Вот краткое объяснение:

^               # 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 ).

9
ответ дан 8 December 2019 в 17:21
поделиться

Он разделяет имя файла на части: букву диска, путь, имя файла и расширение.

Скорее всего, IE использует обратные слеши, а FireFox - слеши. Попробуйте заменить части \\\ на [\\\/], чтобы выражение принимало и слеши, и обратные слеши.

1
ответ дан 8 December 2019 в 17:21
поделиться

От 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
///  

Надеюсь, это поможет, С уважением, Том.

0
ответ дан 8 December 2019 в 17:21
поделиться

Возможно, вам потребуется реализовать валидацию на стороне сервера. Посмотрите эту статью.

Решение проблем валидации ASP.NET

Также есть несколько хороших онлайн-инструментов для создания или интерпретации выражений Regex. но я подозреваю, что проблема не в выражении.

0
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: