我该如何禁止一个单词

时间:2019-06-07 08:58:03

标签: javascript

我想用星号***代替一个坏词。但是,当坏词包含在另一个我不想替换的词中时,就会出现问题。

for(var i = 0; i < forbidden.length; i++) {
    if(textBoxValue.search(forbidden[i]) > -1) {
        textBoxValue = textBoxValue.replace(forbidden[i], '');
    }
}

例如,坏词是“ are ”,如果它是另一个词,例如“ are 不是”,我不希望它显示为“ ***不是”。我只想替换单词。

3 个答案:

答案 0 :(得分:3)

一种选择是使用正则表达式,每边带有单词边界,以确保匹配的单词是独立的:

forbidden.forEach((word) => {
  textBoxValue = textBoxValue.replace(new RegExp('\\b' + word + '\\b', 'g'), '');
});

例如:

let textBoxValue = 'bigwordfoo foo bar barbaz';
const forbidden = ['foo', 'bar'];

forbidden.forEach((word) => {
  textBoxValue = textBoxValue.replace(new RegExp('\\b' + word + '\\b', 'g'), '');
});
console.log(textBoxValue);

如果您实际上要替换为星号而不是空字符串,请使用替换函数:

let textBoxValue = 'bigwordfoo foo bar barbaz';
const forbidden = ['foo', 'bar'];

forbidden.forEach((word) => {
  textBoxValue = textBoxValue.replace(
    new RegExp('\\b' + word + '\\b', 'g'),
    word => '*'.repeat(word.length)
  );
});
console.log(textBoxValue);

当然,请注意,单词限制通常很容易被真正想要克服的人克服。人类几乎总是可以想出方法来愚弄启发式技术。

如果要列入黑名单的任何单词在正则表达式中包含特殊字符,请先将escape them first传递给new RegExp

const escape = s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');

let textBoxValue = 'bigwordfoo foo ba$r ba$rbaz';
const forbidden = ['foo', 'ba$r'];

forbidden.forEach((word) => {
  textBoxValue = textBoxValue.replace(
    new RegExp('\\b' + escape(word) + '\\b', 'g'),
    word => '*'.repeat(word.length)
  );
});
console.log(textBoxValue);

答案 1 :(得分:2)

您可以创建一个动态正则表达式,其中所有禁止的单词都用|分隔,以创建alternation。您可以使用单词边界(\b)将其包装为replace仅匹配完整单词。

对于以下禁用词列表,动态正则表达式最终被

/\b(?:bad|nasty|dreadful)\b/g

replace的第二个参数获取匹配的单词作为参数。您可以使用repeat使*重复与要替换的单词长度相同的次数

function replaceBadWords(textBoxValue, forbidden) {
  const regex = new RegExp(`\\b(?:${forbidden.join('|')})\\b`, 'g')
  return textBoxValue.replace(regex, m => "*".repeat(m.length))
}

const forbidden = ['bad', 'nasty', 'dreadful']

console.log(replaceBadWords('string with some nasty words in it', forbidden))
console.log(replaceBadWords("bad gets replaced with asterisks but badminton won't", forbidden))

答案 2 :(得分:2)

如果您尚未使用库(或者您想使用一个库)

您可以检出this repo

首先,他们已经有了一个坏单词列表,因此您无需考虑它们并思考您错过了什么。

它们支持占位符,例如:

var Filter = require('bad-words');
var customFilter = new Filter({ placeHolder: 'x'});

customFilter.clean('Don't be an ash0le'); //Don't be an xxxxxx

,您可以添加或删除自己的坏词:

var filter = new Filter(); 

// add to list
filter.addWords('some', 'bad', 'word');

// remove from list
filter.removeWords('hells', 'sadist');

如果您有正确的正则表达式,还可以提供多语言支持。