Javascript 如何使用正则表达式测试具有特殊字符的文件名

Javascript 如何使用正则表达式测试具有特殊字符的文件名,javascript,regex,Javascript,Regex,我正在尝试使用此开源图像上载程序: 文档中说,匹配文件类型的函数也可以用于匹配文件名 有人能找到一种方法来使用它来匹配和限制文件名中的特殊字符吗 下面是与我特别想要排除的字符相匹配的正则表达式。我试图阻止最终用户在文件名中使用特殊字符,而不是仅仅依靠训练他们。在这种情况下,英语是唯一的问题 [&~@#$^*()_+=/:?;\\|<>"',!%] [&~@\\\$^*()\+=/:?;\\\\\\”,!%] 这是源代码(开源)中的一个小漏洞,可以对其进行评估。完整的代码

我正在尝试使用此开源图像上载程序:

文档中说,匹配文件类型的函数也可以用于匹配文件名

有人能找到一种方法来使用它来匹配和限制文件名中的特殊字符吗

下面是与我特别想要排除的字符相匹配的正则表达式。我试图阻止最终用户在文件名中使用特殊字符,而不是仅仅依靠训练他们。在这种情况下,英语是唯一的问题

[&~@#$^*()_+=/:?;\\|<>"',!%]
[&~@\\\$^*()\+=/:?;\\\\\\”,!%]
这是源代码(开源)中的一个小漏洞,可以对其进行评估。完整的代码可以在上面的链接中找到

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

    }

});
//文件上传验证插件扩展了文件上传小部件
//使用文件验证功能:
$.widget('blueimp.fileupload',$.blueimp.fileupload{
选项:{
/*
//允许的文件类型的正则表达式匹配
//针对文件类型或文件名:
acceptFileTypes:/(\.\/)(gif | jpe?g | png)$/i,
//允许的最大文件大小(字节):
最大文件大小:10000000,//10 MB
//允许的最小文件大小(字节):
minFileSize:未定义,//没有最小文件大小
//要上载的文件的限制:
maxNumberOfFiles:10,
*/
//函数返回当前文件数,
//必须覆盖maxNumberOfFiles验证:
getNumberOfFiles:$.noop,
//错误和信息消息:
信息:{
maxNumberOfFiles:'超过最大文件数',
acceptFileTypes:“不允许使用文件类型”,
maxFileSize:'文件太大',
minFileSize:'文件太小'
}
},
处理措施:{
验证:功能(数据、选项){
如果(选项。禁用){
返回数据;
}
var dfd=$.Deferred(),
设置=this.options,
file=data.files[data.index],
文件大小;
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');
}如果($.type(fileSize)=='number'&&
fileSize
编辑:我尝试过的一些事情:

感谢您的快速回复。我在这里尝试了一些东西: 其中许多返回匹配,即使名称前面有无效字符。 看见 我不希望asdf&ghjik.jpg匹配为有效

我想我真的想要a-z a-z 0-9-_

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

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

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

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

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

正如@Nit在一篇评论中指出的,白名单规则总是比黑名单好。这意味着总是尝试指定什么是允许的,而不是禁止的,因为很容易遗漏一些东西(你有没有想到英镑符号?非英语字母?通常是UTF字符?)

首先,您可以使用非常简单的
[\w\.\-]

\w元字符用于查找单词字符

单词字符是来自A-z、A-z、0-9的字符,包括uz(下划线)字符


要更好地解释Windows中哪些文件名是好的/坏的,请查看

而不是禁止特定的内容,指定允许的内容。如果只是regex,
[a-Z,a-Z,0-9]
仅允许文件名;否则,输出错误。如果您还想包含某些字符,如句号、连字符、下划线,只需在转义字符前面加上“
,\ \,\,\-
。我不确定javascript中的最佳方式。为什么不包含您尝试过的内容?@ILMostro\u 7该字符组还将包含comma
,因为它不是字符组内部的分隔符。那些没有分隔符的字符,只是一堆字符。此外,不需要转义下划线
,如果破折号是字符组中的最后一个字符,则不需要转义破折号
-
。这就给出了
[a-zA-Z0-9\.\u-]
。编辑了原始版本,并根据反馈进行了一些澄清。感谢您的快速回复!感谢@Stoyan,当我尝试选择无效的部分匹配时。我如何防止这种情况发生?请看,您希望在正则表达式周围使用
^
$
。这意味着它应该以开头和结尾(即匹配整个字符串)我想这几乎是我所需要的,但是我还需要启用多行标志(在我的正则表达式演示中),这样它就只关注一行上的匹配。这似乎是最后的版本