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,当我尝试选择无效的部分匹配时。我如何防止这种情况发生?请看,您希望在正则表达式周围使用^
和$
。这意味着它应该以开头和结尾(即匹配整个字符串)我想这几乎是我所需要的,但是我还需要启用多行标志(在我的正则表达式演示中),这样它就只关注一行上的匹配。这似乎是最后的版本