2013-08-06 25 views
5

Tôi cần 1 cụm từ thông dụng để đặt các hạn chế về loại tệp sử dụng phần mở rộng của tệp.Cụm từ thông dụng để mở rộng tệp

Tôi cố gắng này để hạn chế các loại tập tin html, .class, vv

  1. /(\.|\/)[^(html|class|js|css)]$/i
  2. /(\.|\/)[^html|^class|^js|^css]$/i

tôi cần phải hạn chế tổng cộng 10-15 loại file . Trong ứng dụng của tôi có một trường cho loại tệp được chấp nhận và theo yêu cầu tôi có các loại tệp bị hạn chế. Vì vậy, tôi cần một biểu thức chính quy bằng cách sử dụng phủ định loại tệp bị hạn chế.

Mã plugin như:

$('#fileupload').fileupload('option', { 
      acceptFileTypes: /(\.|\/)(gif|jpe?g|png|txt)$/i 
}); 

tôi có thể xác định acceptedFileType nhưng tôi đã đưa ra những yêu cầu để hạn chế một tập hợp các tập tin.

+0

Javascript? Hoặc ngôn ngữ nào? – xanatos

+2

Nó có thể sẽ dễ dàng hơn để có một vòng lặp và so sánh phần mở rộng của tập tin với mỗi phần mở rộng trong danh sách của bạn. Nếu bất kỳ tiện ích mở rộng nào phù hợp, thì bạn sẽ phá vỡ vòng lặp và ngăn tệp đi xa hơn. – Jerry

+0

Tạo một regex để phù hợp với các loại tệp bị hạn chế. Nếu nó phù hợp với DON "T làm điều đó. –

Trả lời

14

Hãy thử /^(.*\.(?!(htm|html|class|js)$))?[^.]*$/i

Hãy thử nó ở đây: http://regexr.com?35rp0

Nó cũng sẽ làm việc với các tập tin extensionless.

Như tất cả các regexes, nó phức tạp để giải thích ... Hãy bắt đầu từ cuối

[^.]*$ 0 or more non . characters 
(...)? if there is something before (the last ?) 

.*\.(?!(htm|html|class|js)$) Then it must be any character in any number .* 
          followed by a dot \. 
          not followed by htm, html, class, js (?! ...) 
          plus the end of the string $ 
          (this so that htmX doesn't trigger the condition) 

^ the beginning of the string 

này một (?!(htm|html|class|js) được gọi là zero chiều rộng lookahead tiêu cực. Nó được giải thích ít nhất 10 lần mỗi ngày trên SO, vì vậy bạn có thể xem bất cứ nơi nào :-)

+0

Không hoạt động cho: 'test.str.html', chẳng hạn. – Gray

+0

Nó khớp với chuỗi rỗng. Không biết nếu đó là xấu hay không. –

+1

Giải thích từ khóa bị bỏ qua. Nó sẽ là một câu trả lời tốt hơn theo cách đó. –

2

Bạn có vẻ hiểu sai về cách hoạt động của lớp nhân vật. Một lớp nhân vật chỉ khớp với một ký tự đơn. Nhân vật được chọn là nhân vật từ tất cả chúng trong đó. Vì vậy, lớp nhân vật của bạn:

[^(html|class|js|css)] 

không phù hợp html hoặc class theo thứ tự. Nó chỉ phù hợp với một nhân vật duy nhất trong số tất cả các nhân vật khác biệt trong lớp đó.

Điều đó nói rằng, đối với nhiệm vụ cụ thể của bạn, bạn cần phải sử dụng tiêu cực nhìn về phía trước:

/(?!.*[.](?:html|class|js|css)$).*/ 

Tuy nhiên, tôi cũng sẽ xem xét sử dụng thư viện String trong ngôn ngữ tương ứng của tôi, thay vì sử dụng regex, để đạt được nhiệm vụ này. Bạn chỉ cần kiểm tra xem chuỗi có kết thúc bằng bất kỳ phần mở rộng nào không.

+0

Bằng tiếng Anh của Hoa Kỳ và Vương quốc Anh, "có nghĩa là" có nghĩa là "tuy nhiên". Nó có nghĩa là một cái gì đó khác nhau trong tiếng Anh Ấn Độ? – ruakh

+0

@ruakh Trong phần của tôi ở Hoa Kỳ, nó có nghĩa là "ngoài" hoặc "một cách khác để nhìn vào nó" –

+0

@ruakh. Ở đây nó có nghĩa - "ngoài việc đó". –

2

Nếu bạn mở để sử dụng JQuery, bạn có thể xem xét bỏ qua tất cả các regex và đi kèm với một loạt các tiện ích hợp lệ thay thế:

// store the file extensions (easy to maintain, if changesa are needed) 
var aValidExtensions = ["htm", "html", "class", "js"]; 
// split the filename on "." 
var aFileNameParts = file_name.split("."); 

// if there are at least two pieces to the file name, continue the check 
if (aFileNameParts.length > 1) { 
    // get the extension (i.e., the last "piece" of the file name) 
    var sExtension = aFileNameParts[aFileNameParts.length-1]; 

    // if the extension is in the array, return true, if not, return false 
    return ($.inArray(sExtension, aValidExtensions) >= 0) ? true : false; 
} 
else { 
    return false; // invalid file name format (no file extension) 
} 

Lợi thế lớn ở đây là dễ bảo trì. . . thay đổi phần mở rộng tập tin chấp nhận được là một cập nhật nhanh chóng cho mảng (hoặc thậm chí là một tài sản hoặc cập nhật CMS, tùy thuộc vào những điều ưa thích là :)). Ngoài ra, regex có thói quen là một quá trình nhỏ chuyên sâu, vì vậy điều này sẽ hiệu quả hơn (mặc dù, tôi chưa thử nghiệm trường hợp cụ thể này).

+0

mã này không sử dụng regex, nhưng hoạt động tốt. cảm ơn. tốt hơn là sử dụng var aFileNameParts = file_name.toLowerCase(). split (".") thay vì dòng 4 – mhdrad

Các vấn đề liên quan