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

Javascript 检查字符串中是否包含数组值,javascript,html,Javascript,Html,我正在为某种类型的联系人表单进行客户端验证,该网站目前不在线,因此服务器端不相关 我正在尝试创建一个“单词过滤器”,以便在表单“提交”之前捕捉任何对淫秽语言的滥用 这是密码,没有淫秽的东西 function filterInput(str) { var inputFilter = ['word1', 'word2', 'word3']; var arrayLength = inputFilter.length; if (inputFilter.indexOf(str) >

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

我正在尝试创建一个“单词过滤器”,以便在表单“提交”之前捕捉任何对淫秽语言的滥用

这是密码,没有淫秽的东西

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

if (inputFilter.indexOf(str) > - 1) {
    // Word caught...
} else {
    // Clear...
}
如果用户输入“word1”,它将捕获该单词。如果用户输入“word1word2”或“John是一个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;
        } 
    }
}
函数过滤器输入(str){
变量inputFilter=['word1','word2','word3'];
var arrayLength=inputFilter.length;
对于(变量i=0;i
您要查找的是
索引,而不是
索引,因为您必须进行自定义匹配:

if (inputFilter.some(function(word) { return str.indexOf(word) != -1; })) {
    // Word caught...
} else {
    // Clear...
}
或具有ES2015+箭头功能,并且:

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

如果您需要返回实际条目,请使用返回条目的属性,如果未找到,则使用
未定义的属性。如果您需要它的索引,请使用



旁注:要注意,做好这件事是出了名的复杂。当心,当然,人们通常只会混淆字母顺序或替换星号或类似的字符,以击败这类过滤器…

您可以尝试以下方法:-

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;
}
函数过滤器输入(str){
var badWords=['bad','best'];
var isTrue=假;
如果(str){
for(var i=0;i
我才刚开始,所以我想我现在应该避免使用ES2015+。对于一些人来说,与我提出的相比,它是如何工作的?@mrkd1991:不确定你所说的“它是如何工作的”是什么意思。如果你指的是性能,JavaScript引擎在函数调用方面非常快。这是我在2012年写的一篇文章;即使是IE6,你所能要求的最慢的JavaScript引擎,它们的速度也是如此之快,这不是一个因素:比如,这个函数做了什么来获得期望的结果,以及它与我的新尝试之间有什么不同?@mrkd1991:我想我已经解释了上面的结果是如何得到的:“
some
反复调用回调函数,直到它第一次返回真实值为止。如果回调函数曾经返回一个truthy值,那么一些函数将返回
true
;否则,一些返回
false
,因此它会查找
str.indexOf(word)!=-1
(或者在ES2015+版本中
str.includes(word)
为true的任何条目)。这就是你的代码在
for
循环中所做的,只是使用
一些
来代替。你的旁注让我觉得,作为一个初学者,也许有些并不是最好的方法,尽管通常是这样。看看我创建的第二个函数,(除了不使用一些…)是否有任何问题或事情是begginer应该做的不同的?您如何比较使用布尔值与我使用的方法?另外,str在传递之前是格式化的,因此不需要在这个函数中这样做。
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;
}