2015-07-21 63 views
2

我想使用這個開源圖片上傳:https://github.com/blueimp如何使用正則表達式來測試文件名有特殊字符

文檔說的功能相匹配的文件類型可以用來匹配文件名字也。

https://github.com/blueimp/jQuery-File-Upload/blob/7d46990486ff08acfc001b6368b09bce6712c2c2/js/jquery.fileupload-validate.js

任何人都可以看到的方式來使用這個在文件名匹配,限制特殊字符?

以下是與我特別要排除的字符相匹配的RegEx。我試圖阻止最終用戶在文件名中使用特殊字符,而不是僅僅依賴於對它們的培訓。在這種情況下,英語是唯一關心的問題。

[&[email protected]#$^*()_+=/:?;\\|<>"',!%] 

這是來源代碼(開源),將評估它的snipit。完整的代碼可在上面的鏈接中找到。

// The File Upload Validation plugin extends the fileupload widget 
// with file validation functionality: 
$.widget('blueimp.fileupload', $.blueimp.fileupload, { 

    options: { 
     /* 
     // The regular expression for allowed file types, matches 
     // against either file type or file name: 
     acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, 
     // The maximum allowed file size in bytes: 
     maxFileSize: 10000000, // 10 MB 
     // The minimum allowed file size in bytes: 
     minFileSize: undefined, // No minimal file size 
     // The limit of files to be uploaded: 
     maxNumberOfFiles: 10, 
     */ 

     // Function returning the current number of files, 
     // has to be overriden for maxNumberOfFiles validation: 
     getNumberOfFiles: $.noop, 

     // Error and info messages: 
     messages: { 
      maxNumberOfFiles: 'Maximum number of files exceeded', 
      acceptFileTypes: 'File type not allowed', 
      maxFileSize: 'File is too large', 
      minFileSize: 'File is too small' 
     } 
    }, 

    processActions: { 

     validate: function (data, options) { 
      if (options.disabled) { 
       return data; 
      } 
      var dfd = $.Deferred(), 
       settings = this.options, 
       file = data.files[data.index], 
       fileSize; 
      if (options.minFileSize || options.maxFileSize) { 
       fileSize = file.size; 
      } 
      if ($.type(options.maxNumberOfFiles) === 'number' && 
        (settings.getNumberOfFiles() || 0) + data.files.length > 
         options.maxNumberOfFiles) { 
       file.error = settings.i18n('maxNumberOfFiles'); 
      } else if (options.acceptFileTypes && 
        !(options.acceptFileTypes.test(file.type) || 
        options.acceptFileTypes.test(file.name))) { 
       file.error = settings.i18n('acceptFileTypes'); 
      } else if (fileSize > options.maxFileSize) { 
       file.error = settings.i18n('maxFileSize'); 
      } else if ($.type(fileSize) === 'number' && 
        fileSize < options.minFileSize) { 
       file.error = settings.i18n('minFileSize'); 
      } else { 
       delete file.error; 
      } 
      if (file.error || data.files.error) { 
       data.files.error = true; 
       dfd.rejectWith(this, [data]); 
      } else { 
       dfd.resolveWith(this, [data]); 
      } 
      return dfd.promise(); 
     } 

    } 

}); 

編輯:有些東西我曾嘗試:

感謝您的快速反應。我在這裏試過的一些東西: 許多這些返回匹配,即使它名稱之前是一個無效的字符。 請參閱http://regexr.com/3be9o 我不希望asdf & ghjik.jpg匹配有效。

我想我真的想要一個-Z A-Z 0-9 - _

[^&[email protected]#$^*()_+=/:?;\\|<>"',!%]([\w]+\-*[\w]+)+(\.|\/)(gif|jpe?g|png) 

([^&[email protected]#$^*()_+=/:?;\\|<>"',!%])?([\w]+\-*[\w]+)+(\.|\/)(gif|jpe?g|png) 

([\w]+\-+[\w]+)+(\.|\/)(gif|jpe?g|png) 

[^&[email protected]#$^*()_+=/:?;\\|<>"',!%]*(\.jpg)|[^&[email protected]#$^*()_+=/:?;\\|<>"',!%]*(\.png)| 

[^&[email protected]#$^*()_+=/:?;\\|<>"',!%]*(\.gif)|[^&[email protected]#$^*()_+=/:?;\\|<>"',!%]*(\.jpeg) 
+2

而是不允許具體的事情的,指定哪些是允許的。 – Nit

+0

如果它只是正則表達式,'[A-Z,a-z,0-9]'只允許文件名;否則,輸出錯誤。如果您還想包含某些字符,例如句號,連字符,下劃線,只需添加轉義字符'\。,\ _,\ - '。我不確定JavaScript中的最佳方式。你爲什麼不包括你所嘗試過的? –

+1

@ ILMostro_7該字符組還將包含逗號',',因爲這不是字符組內的分隔符。那些沒有分隔符,它只是一堆字符。另外,不需要轉義下劃線'_',如果它是字符組中的最後一個東西,則不需要轉義短劃線'-'。這給了'[a-zA-Z0-9 \ ._-]'。 – simbabque

回答

1

由於@Nit在評論中指出,白名單的規則總是比黑色更好地上市。這意味着總是試圖指定允許的內容而不是禁止的內容,因爲它很容易錯過某些東西(您是否想過英鎊符號?非英文字母?一般的UTF字符?)

作爲開始,您可以使用很簡單[\w\.\- ]

\ W元字符用於查找單詞字符。

單詞字符是來自a-z,A-Z,0-9的字符,包括_(下劃線)字符。

關於什麼是好的一個很好的解釋/在Windows錯誤的文件名來看看this thread.

+0

謝謝@Stoyan 當我嘗試它選擇無效的部分匹配。我如何防止這種情況發生?請參閱http://regexr.com/3bed7 – rustyspark

+1

您希望在您的正則表達式中使用'^'和'$'。這意味着它應該開始和結束(即匹配整個字符串)[演示](http://regexr.com/3begv) –

+0

我認爲這幾乎是我需要的,但是我也需要啓用多行標誌(在我的正則表達式演示中),以便它只會關注一條線上的匹配。 這似乎是有效的最終版本。 http://regexr.com/3bed7(/ *)(gif | jpe?g | png) – rustyspark