Check if array value is included in string

為{幸葍}努か 提交于 2021-02-05 05:28:05

问题


I'm working on some client side validation for a contact form of sorts, the website currently isn't online so server side isn't relevant.

I am trying to create a 'word filter' to catch on any abusive of obscene language before the form is 'submitted'.

Heres the code, without the obscenities...

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

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

If the user were to enter 'word1', it will catch the word. If the user enters 'word1word2' or 'John is a word3', it doesn't catch it.

I originally had a for loop which worked better, but still wouldn't work without whitespace between words('word1word2').

Any input would be greatly appreciated, I've been searching but nothing quite matches my needs.

EDIT: So I too have come up with a solution, but seeing the varying ways this can be achieved I am curious as to how it works and also why a particular way is better?

Heres what I came up with...

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;
        } 
    }
}

回答1:


You're looking for some rather than indexOf, since you have to do custom matching:

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

Or with an ES2015+ arrow function and String.prototype.includes:

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

some calls the callback repeatedly until the first time it returns a truthy value. If the callback ever returns a truthy value, some returns true; otherwise, some returns false. E.g., it's asking if "some" of the entries match the predicate function. (any may have been a better term, but when adding to the built-ins, the TC39 committee have to do a lot of work to avoid conflicts with libraries and such.)

If you ever need to get back the actual entry, use find which returns the entry or undefined if not found. If you need its index, use findIndex.


Side note: Just beware that it's notoriously complicated to do this well. Beware of the Scunthorpe problem, and of course people will routinely just confuse the sequence of letters or substitute asterisks or similar to defeat filters of this sort...




回答2:


you can try something like this:-

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;
}


来源:https://stackoverflow.com/questions/46526522/check-if-array-value-is-included-in-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!