0

我正在构建一个非常基本的亵渎过滤器,我只想将其应用于服务器端应用程序(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.

如何修复这个“连续”错误?

4

3 回答 3

3

test方法将正则表达式的lastIndex属性设置为当前匹配的位置,以便进一步的调用将匹配更多的事件(如果有的话)。

check.lastIndex // 0 (init)
filterString('ass'); // true
check.lastIndex // 3
filterString('ass'); // false
check.lastIndex // now 0 again

filterString因此,如果您不每次都重新创建 RegExp ,则需要在函数中手动重置它:

function filterString(string) {
    check.lastIndex = 0;
    return check.test(string);
}

顺便说一句,要仅匹配完整的单词(例如“ass”,而不是“assster”),您应该将匹配项包装在 WTK 建议的单词边界中,即

var check = new Regexp("\\b(?:"+badWords.join('|')+")\\b", 'gi');
于 2012-10-09T11:57:18.253 回答
2

您正在通过子字符串比较进行匹配。您的正则表达式需要修改以匹配整个单词

于 2012-10-09T11:25:20.777 回答
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这里使用 match 来匹配单词边界(以及整个字符串的开头或结尾)。

于 2012-10-09T11:44:35.407 回答