检查变量是否包含数组中的任何字符

时间:2013-07-22 06:58:00

标签: javascript filenames

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

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执行此操作的内置函数?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

答案 1 :(得分: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;
}

test it

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