Javascript亵渎匹配不替换

时间:2012-10-09 11:22:31

标签: javascript profanity

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

如何解决这个“连续”错误?

3 个答案:

答案 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匹配来匹配单词边界(以及整个字符串的开头或结尾)。