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?
3 Antworten
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');
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.
Sie stimmen über einen Teilstring-Vergleich überein. Ihr Regex muss so geändert werden, dass er stattdessen für ganze Wörter passt