我正在构建一个非常基本的脏话过滤器,我只想将其应用于服务器端上我的应用程序(fullName、userDescription)的某些字段。
有人有在生产中使用脏话过滤器的经验吗?我只希望它:
'ass hello' <- match
'asster' <- NOT match
下面是我当前的代码,但由于某种原因,它连续返回 true 和 false。
var badWords = [ 'ass', 'whore', 'slut' ]
, check = new Regexp(badWords.join('|'), 'gi');
function filterString(string) {
return check.test(string);
}
filterString('ass'); // Returns true / false in succession.
如何修复这个“连续”错误?
最佳答案
test
method设置lastIndex
property正则表达式到当前匹配位置,以便进一步的调用将匹配进一步的出现(如果有)。
check.lastIndex // 0 (init)
filterString('ass'); // true
check.lastIndex // 3
filterString('ass'); // false
check.lastIndex // now 0 again
因此,如果您不每次都重新创建 RegExp,则需要在 filterString
函数中手动重置它:
function filterString(string) {
check.lastIndex = 0;
return check.test(string);
}
顺便说一句,要仅匹配完整单词(例如“ass”,但不匹配“asster”),您应该将匹配项包裹在单词边界中,如 WTK 建议的那样,即
var check = new Regexp("\\b(?:"+badWords.join('|')+")\\b", 'gi');
关于Javascript 脏话匹配而不是替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799173/