2013-08-06 155 views
5

我需要1個正則表達式來使用擴展名來限制文件類型。擴展文件的正則表達式

我想這限制HTML的文件類型,的.class等

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

我需要限制總計10-15類型的文件。在我的應用程序中有一個用於接受文件類型的字段,根據要求我有要限制的文件類型。所以我需要一個只使用否定受限文件類型的正則表達式。

插件代碼如下:

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

我可以指定acceptedFileType但我已經給限制一組文件的要求。

+0

Javascript?或者哪種語言? – xanatos

+2

它可能會更容易有一個循環,並將文件的擴展名與列表中的每個擴展名進行比較。如果任何擴展名匹配,那麼你打破循環,並阻止文件進一步。 – Jerry

+0

爲匹配受限制的文件類型創建一個正則表達式。如果它匹配DON「T do it。 –

回答

14

嘗試/^(.*\.(?!(htm|html|class|js)$))?[^.]*$/i

這裏試試:http://regexr.com?35rp0

它還將與擴展名的文件。

由於所有的正則表達式,它是複雜的解釋...讓我們從最終

[^.]*$ 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 

這一個(?!(htm|html|class|js)被稱爲零寬度負預測先行啓動。它每天至少解釋10次SO,所以你可以看看任何地方:-)

+0

不適用於:'test.str.html',例如。 – Gray

+0

它匹配空字符串。不知道這是否糟糕。 –

+1

解釋否定的前瞻。這將是更好的答案。 –

2

你似乎誤解了一個角色類的作品。一個字符類只匹配一個字符。所選的角色是那裏的角色。所以,你的人物等級:

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

不匹配序列htmlclass。它只匹配該類中所有不同字符中的單個字符。

這就是說,爲特定的任務,你需要使用負前瞻

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

不過,我也會考慮使用String庫在我各自的語言,而不是使用正則表達式來實現這個任務。您只需測試一下,字符串是否以任何擴展名結尾。

+0

在美國和英國英文中,「that said」的意思是「但是」。這是否意味着印度英語有所不同? – ruakh

+0

@ruakh在我的美國部分,這意味着「另外」或「看着它的另一種方式」 –

+0

@ruakh。這意味着 - 「除此之外」。 –

2

如果你願意使用JQuery,你可以考慮跳過所有的正則表達式,並用一組有效的擴展代替:

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

這裏的一大優勢就是易於維護。 。 。更改可接受的文件擴展名是對數組的快速更新(甚至是屬性或CMS更新,具體取決於奇特的事情:))。此外,regex有一個過程密集的一點點的習慣,所以這應該是更有效的(雖然,我還沒有測試過這種特殊情況)。

+0

這段代碼不使用正則表達式,但工作正常。謝謝。更好地使用var aFileNameParts = file_name.toLowerCase()。split(「。」)而不是第4行 – mhdrad