Frage von Etnirp, 61

Bad Word Filter schreiben mit Javascript?

Habe als Aufgabe mit JS einen Bad Word Filter zu schreiben. Dabei soll ein Text auf eine Liste von Wörtern durchsucht werden und falls auch in einem Wort drinnen eins dieser Bad Words auftaucht sollen die Buchstaben durch "*" ersetzt werden.

Bis jetzt habe ich mit HTML eine Eingabe und einen Button der den Text überprüfen soll gemacht. Der Button ruft eine Funktion auf, die den Text in eine Variable speichert, dann den gesamten Text klein macht und ihn in ein Array aufteilt. Außerdem habe ich schon einen array mit einige bösen Wörtern geschrieben.

Nun zu meinem Problem: Ich weiß einfach nicht wie das Abgefragt werden soll, habe es jetzt schon mit vielen verschiedenen if Unterscheidungen und for Schleifen probiert aber es will einfach nicht, vlt habe ich auch einfach einen Denkfehler...

Kann mir jemanden helfen? Bzw. sagen wie ich diesen Vergleich machen/schreiben soll? Vielen Dank im vorhinein und schöne Ostern! LG Etnirp

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Sarkophator, 26

Man könnte die Fehlerquelle vielleicht besser eingrenzen, wenn du uns den Code zeigen könntest. Ansonsten kannst du das bei einem Array ähnlich wie unten angegeben machen.

Alternativ kannst du die Badwords auch vorher schon mittels regex-Replace parsen, bevor du den Text in ein Array umwandelst:

var text = text.replace(RegExp(badwordlist.join("|"), "gi"), function(match) {
return match.replace(/./g, "*");
});

Das Script findet allerdings auch Badwords die in anderen Wörtern drinstecken. Um das zu unterbinden kannst du auch ein "\b" vor und nach "badwordlist.join(...)"  setzen.

Das Problem was du mit Badword-Filtern hast, die auch die Inhalte von einzelnen Wörtern durchsuchen (also obiges Beispiel) ist, ist auch als das Scunthorpe-Problem bekannt. (Das Script filtert Badwords in Wörtern, die eigentlich als Ganzes was anderes bedeuten) Hier der Wikipedia-Artikel dazu: https://en.wikipedia.org/wiki/Scunthorpe_problem

Einen Algorithmus zu schreiben, der das Ganze umgeht, ist, wie du dir aber sicher auch denken kannst, keine einfache Aufgabe.

Kommentar von Etnirp ,

Vielen Dank! Mit deinem kurzen Code funktioniert das jetzt ideal, nur müsste ich halt erklären können was in dem Teil passiert, kannst du mir das eventuell noch kurz erläutern? Also was die einzelnen Befehle machen :)

Kommentar von Sarkophator ,

Das ist im Grunde nur einfaches Regex (Regular Expressions bzw. Reguläre Ausdrücke, was allerdings ein einigermaßen weitreichendes Thema ist, da muss man sich einfach beschäftigen) mehr nicht.

Die Badwordliste wird so zusammengesetzt, dass zwischen den einzelnen Einträgen das Verkettungszeichen bzw. das Pipe-Zeichen ( | ) eingesetzt wird, mit dem Alternativen ("oder") angegeben werden können. Daraus wird dann ein RegExp-Objekt mit den Flags "gi" (g für globale Suche, d.h. dass es mehr als einen Treffer geben kann und i für Groß-/Kleinschreibung ignorieren) erstellt und an die replace-Funktion weitergegeben. Das wäre der Hauptpart.

Auf Regex werde ich jetzt nicht genau eingehen, da das einfach zu viel wäre. Kannst dich aber hier vielleicht etwas reinlesen:

https://developer.mozilla.org/de/docs/Web/JavaScript/Guide/Regular\_Expressions

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Object...

Der Output von dem RegExp-Objekt oben wäre etwas in der Art von "/Wort1|Wort2|Wort3/gi".

Musst allerdings aufpassen dass deine Badwords keine speziellen Zeichen enthalten, da diese sonst auch so interpretiert werden. (d.h. wenn ein Punkt bspw. auftaucht, dann entspricht das allen möglichen Zeichen etc.)

Ansonsten wird dieser Reguläre Ausdruck einfach auf deinen Text angewendet und alle gefundenen Textstellen an die im zweiten Parameter übergebene Funktion weitergegeben. (Der zweite Parameter darf auch ein String sein der als Ersatz einfach eingesetzt wird, da die Wortlänge aber variabel ist, habe ich hier die Funktion genutzt)

Diese übergebene Funktion gibt dann entsprechend den String aus, der als Ersatz fungieren soll. Hier habe ich einfach mittels /./g alle Zeichen aus dem Treffer gematcht und durch "*" ersetzt.

Sollte noch irgendwas offen sein, kannst du ja nochmal fragen.

Antwort
von Berny96, 42

Du hast einen Array mit den Wörtern die überprüft werden sollen und einen Array mit verbotenen Wörtern. Du musst den ersten Array mit einer schleife durch laufen und in jedem durchlauf in einer weiteren schleife abfragen ob das aktuelle Wort mit dem vom zweiten array gleich ist. Sollte es wahr sein dann setzt du die array stelle des ersten Arrays auf "*".
Das hier ist jetzt pseudocode das heisst so im prinzip kann es aussehen(siehe Bild):

Kommentar von Etnirp ,

Danke schon mal für deine Antwort!

Habe es genauso schon probiert, es passiert gar nichts, die Konsole gibt aber auch keine Fehler aus...

Weiters ist das Problem bei dieser Methode, das falls ein Badword in einem anderen Drin steckt, dieses als aktzeptabel erkannt wird, das nicht sein. Also es sollte auch versteckte Badwords finden und das kann ich mir nicht vorstellen, wie das gehen soll.

Kommentar von Berny96 ,

Okay, also ohne deinen Code kann ich das Problem nicht finden aber das was ich gepostet habe sollte funktionieren wenn richtig implementiert. 

Das zweite Problem kannst du lösen indem du anstatt auf Gleichheit zu überprüfen string.replace benutzt. 

Das könnte ca. so aussehen:

for...

{

     for...

      {

                arrayTex[i].replace(badwords[i], "*");

     }

}


Das ersetzt jedes Vorkommen des Badwords in der Array stelle mit *. Da brauchst du auch keine if mehr denn wenns nicht vorkommt wird auch nichts ersetzt. Hoffe das hilft.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten