Ich erstelle einen sehr einfachen Profanitätsfilter, den ich nur auf einige Felder in meiner Anwendung (fullName, userDescription) auf der Serverseite anwenden möchte.

Hat jemand Erfahrung mit einem Obszönitätsfilter in der Produktion? Ich möchte nur, dass es:

'ass hello' <- match
'asster' <- NOT match

Unten ist mein aktueller Code, der jedoch aus irgendeinem Grund auf nacheinander wahr und falsch zurückgibt.

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.

Wie kann ich diesen Fehler "nacheinander" beheben?

0
onlineracoon 9 Okt. 2012 im 15:22

3 Antworten

Beste Antwort

Die test -Methode legt die fest lastIndex -Eigenschaft der Regex an die aktuell übereinstimmende Position, sodass weitere Aufrufe mit weiteren Vorkommen übereinstimmen (falls vorhanden).

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

Sie müssen es also manuell in Ihrer filterString -Funktion zurücksetzen, wenn Sie RegExp nicht jedes Mal neu erstellen:

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

Übrigens, um nur vollständige Wörter (wie "ass", aber nicht "asster") abzugleichen, sollten Sie Ihre Übereinstimmungen in Wortgrenzen einschließen, wie von WTK vorgeschlagen, d. H.

var check = new Regexp("\\b(?:"+badWords.join('|')+")\\b", 'gi');
3
Bergi 9 Okt. 2012 im 12:34

Wie wäre es mit festem regulären Ausdruck:

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

Ich verwende hier \b match, um die Wortgrenze (und den Anfang oder das Ende der gesamten Zeichenfolge) abzugleichen.

1
WTK 9 Okt. 2012 im 11:50

Sie stimmen über einen Teilstring-Vergleich überein. Ihr Regex muss so geändert werden, dass er stattdessen für ganze Wörter passt

2
AJ. 9 Okt. 2012 im 11:25