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" などではなく "ass" など) のみに一致させるには、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 に答える