如何使用正则表达式测试带有特殊字符的文件名
How to use Regular expression to test for FIle Names with special characters
我正在尝试使用这个开源图像上传器:https://github.com/blueimp
文档说匹配文件类型的函数也可以用来匹配文件名。
https://github.com/blueimp/jQuery-File-Upload/blob/7d46990486ff08acfc001b6368b09bce6712c2c2/js/jquery.fileupload-validate.js谁能看到一种方法来使用它来匹配和限制文件名中的特殊字符?
下面是将匹配我特别想要排除的字符的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();
}
}
});
编辑:一些事情我已经尝试过了:
感谢您的快速回复。我在这里尝试了一些事情:即使名称前面有无效字符,其中许多也会返回匹配项。参见http://regexr.com/3be9o我不希望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)
正如@Nit在评论中指出的那样,白名单规则总是比黑名单规则更好。这意味着总是尝试指定什么是允许的,而不是什么是禁止的,因为很容易遗漏一些东西(你想到磅号了吗?非英文字母吗?一般的UTF字符?)
一开始你可以使用非常简单的['w'.'- ]
'w元字符用于查找单词字符。
一个单词字符是A- z, A- z, 0-9中的一个字符,包括_(下划线)。
在Windows中什么是好的/坏的文件名,看一下这个线程。
相关文章:
- javascript替换换行符和特殊字符
- angularjs删除动态形式元素中的特殊字符
- 使用json_encode通过xmlhttp.responseText发送特殊字符(即caron)
- 在搜索中考虑特殊字符的
- 避免键入一些特殊字符
- Regex测试特殊字符
- 在 Javascript 中对特殊字符进行排序 (æ)
- 必须检查长度,并在文本框中允许一些特殊字符
- 一个jquery验证器方法,它不接受纯数字或纯特殊字符,但接受上面是否有字母
- 用于在Javascript中删除多个空格的特殊字符
- jQuery-Regex以防止任何特殊字符
- javascript正则表达式来识别所有特殊字符
- RegEx只获取特殊字符,前后不获取任何字符
- 如何使用JQuery检查输入(电子邮件)字段是否包含特殊字符
- Javascript:包括特殊字符的文本选择
- 获取特殊字符后没有单词的句子
- 替换字符串javascript中的所有特殊字符..
- 在cshtml中对特殊字符进行编码
- 从JavaScript中正确返回html中的特殊字符
- 如何使用正则表达式测试带有特殊字符的文件名