检查字符串中是否包含数组值

时间:2017-10-02 13:32:51

标签: javascript html

我正在为某种联系表单进行客户端验证,该网站目前不在线,因此服务器端不相关。

我正在尝试创建一个“文字过滤器”,以便在表单“提交”之前抓住任何滥用淫秽语言的行为。

继承代码,没有猥亵......

function filterInput(str) {
    var inputFilter = ['word1', 'word2', 'word3'];
    var arrayLength = inputFilter.length;

if (inputFilter.indexOf(str) > - 1) {
    // Word caught...
} else {
    // Clear...
}

如果用户输入'word1',它将捕获该单词。如果用户输入'word1word2'或'John is a word3',则无法捕获它。

我最初有一个for循环,效果更好,但如果没有单词之间的空格('word1word2')仍然无法工作。

任何输入都会非常感激,我一直在寻找,但没有什么能满足我的需求。

编辑:所以我也提出了一个解决方案,但是看到可以实现的不同方式,我很好奇它是如何工作的,以及为什么特定的方式更好?

这是我想出来的......

function filterInput(str) {
    var inputFilter = ['word1', 'word2', 'word3'];
    var arrayLength = inputFilter.length;

    for (var i = 0; i < arrayLength; i++) {
        if (str.includes(inputFilter[i])) {
            window.alert('Message...');
            return;
        } 
    }
}

2 个答案:

答案 0 :(得分:5)

您正在寻找some而不是indexOf,因为您必须进行自定义匹配:

if (inputFilter.some(function(word) { return str.indexOf(word) != -1; })) {
    // Word caught...
} else {
    // Clear...
}

或使用ES2015 +箭头功能和String.prototype.includes

if (inputFilter.some(word => str.includes(word))) {
    // Word caught...
} else {
    // Clear...
}

some重复调用回调,直到它第一次返回truthy值。如果回调值返回真值,some将返回true;否则,some会返回false。例如,它询问条目中的“一些”是否与谓词函数匹配。 (any可能是一个更好的术语,但是当添加到内置插件时,TC39委员会必须做很多工作以避免与库等冲突。)

如果您需要取回实际条目,请使用返回条目的findundefined(如果未找到)。如果您需要其索引,请使用findIndex

附注:请注意,做得好这一点非常复杂。谨防the Scunthorpe problem,当然人们会经常只是混淆字母序列或替代星号或类似于这类失败过滤器......

答案 1 :(得分:0)

你可以尝试这样的事情: -

function filterInput(str) {
  var badWords = ['bad', 'worst'];
  var isTrue = false;
  if(str) {
     for (var i = 0; i < badWords.length; i++) {
       isTrue = !!(str.replace(/\W|\s/g, '').toLowerCase().indexOf(badWords[i]) + 1);
       if(isTrue) break;
     }
  }
  return isTrue;
}