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

How to use Regular expression to test for FIle Names with special characters

本文关键字:特殊字符 文件名 何使用 正则表达式 测试      更新时间:2023-09-26

我正在尝试使用这个开源图像上传器: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中什么是好的/坏的文件名,看一下这个线程。