我正在构建一个非常基本的亵渎过滤器,我只想在服务器端上的应用程序(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.
如何解决这个“连续”错误?
答案 0 :(得分:3)
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);
}
顺便说一句,为了只匹配完整的单词(比如“屁股”,而不是“捣蛋”),你应该像WTK建议的那样将你的匹配包装在单词边界内,即
var check = new Regexp("\\b(?:"+badWords.join('|')+")\\b", 'gi');
答案 1 :(得分:2)
您通过子字符串比较进行匹配。您的正则表达式需要修改以匹配整个单词
答案 2 :(得分:1)
固定正则表达式如何:
check = new Regexp('(^|\b)'+badWords.join('|')+'($|\b)', 'gi');
check.test('ass') // true
check.test('suckass') // false
check.test('mass of whore') // true
check.test('massive') // false
check.test('slut is massive') // true
我在这里使用\b
匹配来匹配单词边界(以及整个字符串的开头或结尾)。