2010-02-18 36 views
6

Tôi đang cố hiểu chi tiết câu lệnh RegEx này. Đó là nghĩa vụ phải xác nhận tên tập tin từ ASP.Net FileUpload kiểm soát để cho phép chỉ tập tin jpeg và gif. Nó được thiết kế bởi người khác và tôi không hoàn toàn hiểu nó. Nó hoạt động tốt trong Internet Explorer 7.0 nhưng không hoạt động trong Firefox 3.6.Hiểu câu lệnh RegEx này

<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> 
+0

Không chắc chắn tại sao điều này lại bị bỏ phiếu xuống. –

+2

bởi vì nó yêu cầu mọi người cá cho anh ta, không dạy anh ta để cá. 3 upvotes thực sự? Đăng một milion "whats regex này có nghĩa là" câu hỏi tôi đoán. –

+0

Tôi đồng ý với Brian, điều này khá lố bịch. –

Trả lời

4

Đây là một regex xấu.

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

Hãy thực hiện từng phần một.

([a-zA-Z]:) 

Điều này yêu cầu đường dẫn tệp bắt đầu bằng ổ đĩa như C:, d:, v.v.

(\\{2}\w+)\$?) 

\\{2} có nghĩa là dấu chéo ngược lặp lại hai lần (chú ý \ nhu cầu để được thoát), tiếp theo là một số chữ cái và số (\w+), và sau đó có thể là một dấu đô la (\$?). Đây là phần chủ của con đường UNC.

([a-zA-Z]:)|(\\{2}\w+)\$?) 

| có nghĩa là "hoặc". Vì vậy, hoặc bắt đầu bằng một ký tự ổ đĩa hoặc một đường dẫn UNC. Chúc mừng bạn đã khởi động những người dùng không phải Windows.

(\\(\w[\w].*)) 

này nên phần thư mục của con đường, nhưng thực sự là 2 chữ cái và số tiếp theo bất cứ điều gì ngoại trừ dòng mới (.*), như \[email protected]#*(#$*).

Các regex thích hợp cho phần này nên (?:\\\w+)+

(.jpg|.JPG|.gif|.GIF)$ 

này có nghĩa là 3 ký tự cuối cùng của con đường phải jpg, JPG, gif hoặc GIF. Lưu ý rằng .không phải một dấu chấm, nhưng phù hợp với bất kỳ thứ gì ngoại trừ \n, vì vậy, tên tệp như haha.abcgif hoặc malicious.exe\0gif sẽ chuyển.

Các regex thích hợp cho phần này nên \.(?:jpg|JPG|gif|GIF)$

Cùng,

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

sẽ phù hợp

D:\foo.jpg 
\\remote$\dummy\..\C:\Windows\System32\Logo.gif 
C:\Windows\System32\cmd.exe;--gif 

và sẽ thất bại

/home/user/pictures/myself.jpg 
C:\a.jpg 
C:\d\e.jpg 

Các regex đúng là /\.(?:jpg|gif)$/i, và kiểm tra xem các tập tin được tải lên thực sự là một hình ảnh ở phía máy chủ.

+0

WOW! Cảm ơn rất nhiều chi tiết. Đây là những gì tôi đang tìm kiếm. Giải quyết vấn đề của tôi. Vẫn còn tò mò tại sao bản gốc không hoạt động trong Firefox. Có thể là một chủ đề cho câu hỏi riêng biệt, nhưng có lẽ không phù hợp với chủ đề chính ở đây. – myforums

+0

Xin lỗi. Chỉ thấy rằng '' không hoạt động cho 'C: \ doc \ My Pictures \ cat-fish.gif' – myforums

9

Dưới đây là một lời giải thích ngắn gọn:

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

EDIT

Như một số các yêu cầu bình luận, bên trên được tạo ra bởi một công cụ nhỏ tôi đã viết. Bạn có thể tải ở đây: http://www.big-o.nl/apps/pcreparser/pcre/PCREParser.html (Chú ý: nặng nề đang được xây dựng!)

EDIT 2

Nó sẽ phù hợp với chuỗi như thế này:

x:\abc\def\ghi.JPG 
c:\foo\bar.gif 
\\foo$\baz.jpg 

Đây là những gì các nhóm 1, 4 và 6 đối sánh riêng lẻ:

group 1 | group 4  | group 6 
--------+--------------+-------- 
     |    | 
x:  | \abc\def\ghi | .JPG 
     |    | 
c:  | \foo\bar  | .gif 
     |    | 
\\foo$ | \baz   | .jpg 
     |    | 

Lưu ý rằng nó cũng khớp với một chuỗi như c:\foo\[email protected] kể từ khi chiếu DOT ches bất kỳ ký tự nào (ngoại trừ ngắt dòng). Và nó sẽ từ chối một chuỗi như c:\foo\bar.Gif (số G trong gif).

+0

Tôi có thể hỏi công cụ bạn sử dụng cho công việc này không? – Skilldrick

+0

Bart K. Bạn có thể đăng URL cho phép thực hiện phân tích cú pháp này không? – myforums

+0

+1 chi tiết! Tôi cũng muốn biết nếu điều này được sản xuất bởi một công cụ. – Pharabus

1

Nó chia nhỏ tên tệp thành các phần, đường dẫn, tên tệp và phần mở rộng.

Hầu hết có thể IE sử dụng dấu gạch chéo ngược trong khi FireFox sử dụng dấu gạch chéo. Cố gắng thay thế các phần \\ bằng [\\ /] để biểu thức sẽ chấp nhận cả dấu gạch chéo và dấu gạch chéo ngược.

+0

Không. Hoán đổi \\ với [\\\ /] không hữu ích. Vẫn không hoạt động trong Firefox. – myforums

0

Từ Expresso đây là những gì Expresso nói:

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

Hope this helps, Trân trọng, Tom.

0

Bạn có thể cần triển khai xác thực phía máy chủ. Hãy xem bài viết này.

Solving the Challenges of ASP.NET Validation

Ngoài ra, có một số công cụ trực tuyến tốt để tạo hoặc giải thích biểu thức Regex. nhưng tôi nghi ngờ rằng vấn đề không phải là với biểu thức.