我想用星号***
代替一个坏词。但是,当坏词包含在另一个我不想替换的词中时,就会出现问题。
for(var i = 0; i < forbidden.length; i++) {
if(textBoxValue.search(forbidden[i]) > -1) {
textBoxValue = textBoxValue.replace(forbidden[i], '');
}
}
例如,坏词是“ are ”,如果它是另一个词,例如“ are 不是”,我不希望它显示为“ ***不是”。我只想替换单词。
答案 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');
如果您有正确的正则表达式,还可以提供多语言支持。