1

我有以下 JavaScript,禁止将文件命名为特定名称,并禁止某些字符出现在名称中的任何位置

var file = 'somefile';
var contain = ['"', '*', ':', '<', '>', '?', '\\', '/', '|', '+', '[', ']'];
var fullname = ['AUX', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7',
  'COM8', 'COM9', 'CON', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7',
  'LPT8', 'LPT9', 'NUL', 'PRN'];

if(fullname.indexOf(file.toUpperCase()) >= 0)
{
    alert('Your file must not be named any of these words:\n\n' +
      fullname.join(' '));
    return;
}

if(/* file contains any chars in contain[] */)
{
    alert('Your file name must not contain any of these characters:\n\n' +
      contain.join(' '));
    return;
}

我想知道如何检查是否file包含contain数组中的任何项目。

我可以使用for循环,如下所示:

for(var i = 0; i < contain.length; i++)
    if(file.indexOf(contain[i]) >= 0)
        ...

但是为此使用循环似乎是“错误的”。

是否有任何内置函数可以使用 vanilla JavaScript 执行此操作?

4

2 回答 2

2

如果您正在使用,.indexOf()那么循环是唯一的方法。

但是,您也可以使用正则表达式:

var contain = /["*:<>?\\/|+\[\]]/;
var fullname = /^(AUX|COM1|...)$/i;   // NB: "i" flag for case insensitive

if (contain.test(file)) {
    ...
}

if (fullname.test(file)) {
    ...
}

这应该非常有效,因为正则表达式将在 JS 解释器中以本机代码进行处理。

于 2013-07-22T07:02:27.210 回答
0

您是否为此考虑过正则表达式?

你的代码会是这样的:

var file = 'somefile';

document.body.style.background = "#4f4";


var contain = ['"', '*', ':', '<', '>', '?', '\\', '/', '|', '+', '[', ']'];
var fullname = ['AUX', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7',
  'COM8', 'COM9', 'CON', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7',
  'LPT8', 'LPT9', 'NUL', 'PRN'];

if(fullname.indexOf(file.toUpperCase()) >= 0)
{    
    alert('Your file must not be named any of these words:\n\n' +
        fullname.join(' '));
    return;
}

// If you want to keep the invalid characters as a array:
var containAsString = contain.join("").replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');

// the reg expression will look like "[;\.]"
var re = new RegExp("["+ containAsString +"]");

if(re.test(file))
{    
    alert('Your file name must not contain any of these characters:\n\n' +
      contain.join(' '));
    return;
}

测试一下

编辑:接受的答案显然更干净,但至少这个答案现在尊重 SO 政策

于 2013-07-22T07:00:53.790 回答