PHP Schimpfwortfilter

8

Ich arbeite an einem WordPress-Plugin, das die schlechten Wörter aus den Kommentaren mit zufälligen neuen aus einer Liste ersetzt.

Ich habe jetzt zwei Arrays: eins enthält die schlechten Wörter und ein anderes enthält die guten Wörter.

%Vor%

Da ich ein Anfänger bin, bin ich irgendwann steckengeblieben.

Um die schlechten Wörter zu ersetzen, habe ich $newstring = str_replace($bad, $good, $string); benutzt.

Mein erstes Problem ist, dass ich die Groß- / Kleinschreibung abschalten möchte, also werde ich die Wörter nicht so schreiben "bad", "Bad", "BAD", "bAd", "BAd", etc , aber ich brauche das neue Wort, um das Format des ursprünglichen Wortes zu behalten, zum Beispiel wenn ich schreibe "Schlecht" würde es durch "Wörter" ersetzt werden, aber wenn ich "schlecht" schreibe, würde es durch "Wörter", usw. Ersetzt werden.

Mein erster Gedanke war, str_ireplace zu verwenden, aber es vergisst, wenn das ursprüngliche Wort einen Großbuchstaben hatte.

Das zweite Problem ist, dass ich nicht weiß, wie ich mit den Benutzern umgehen soll, die so schreiben: "b a d", "w ords" usw. Ich brauche eine Idee.

Um ein zufälliges Wort auszuwählen, kann ich $new = $good[rand(0, count($good)-1)]; und dann $newstring = str_replace($bad, $new, $string); verwenden. Wenn du eine bessere Idee hast, bin ich hier um zuzuhören.

Das allgemeine Aussehen meines Skripts:

%Vor%

Vielen Dank im Voraus für Ihre Hilfe!

    
Rawrrr1337 14.10.2013, 11:03
quelle

2 Antworten

6

Vorläufer

Es gibt (wie in den Kommentaren mehrfach darauf hingewiesen wurde) klaffende Löcher für Sie - und / oder Ihren Code -, in die Sie durch die Implementierung eines solchen Features eindringen können, um nur einige zu nennen:

  1. Personen fügen dem Narr Zeichen
  2. Zeichen hinzu
  3. Menschen werden kreativ (z. B. Anspielungen)
  4. Die Leute werden passive Aggression und Sarkasmus verwenden
  5. Menschen werden Sätze / Phrasen verwenden, nicht nur Wörter

Es wäre besser, ein Moderations- / Markierungssystem zu implementieren, in dem Leute anstößige Kommentare markieren können, die dann von Mods, Benutzern usw. bearbeitet / entfernt werden können.

Lassen Sie uns in diesem Zusammenhang fortfahren ...

Lösung

Da Sie:

  1. Habe eine Liste verbotener Wörter $bad_words
  2. Haben Sie eine Ersatzwortliste $good_words
  3. Willige Wörter ersetzen unabhängig von case
  4. Möchte schlechte Wörter durch zufällige gute Wörter ersetzen
  5. Eine korrekt gemixt Bad Word -Liste haben: siehe Ссылка

Sie können PHP s preg_replace_callback function sehr einfach verwenden:

%Vor%

Okay, das preg_replace_callback erstellt also ein Regex-Muster, das aus allen schlechten Wörtern besteht. Übereinstimmungen haben dann folgendes Format:

%Vor%

Der Modifikator " i " unterscheidet zwischen Groß- und Kleinschreibung, sodass sowohl bad als auch Bad übereinstimmen.

Die Funktion replace_words nimmt dann das übereinstimmende Wort und seine Grenzen (entweder leer oder ein Leerraumzeichen) und ersetzt es durch die Grenzen und ein zufälliges gutes Wort .

%Vor%

Anonyme Funktion

Sie könnten das oben genannte als einen Liner mit einer anonymen Funktion in preg_replace_callback

umschreiben %Vor%

Funktions-Wrapper

Wenn Sie es mehrmals verwenden, können Sie es auch als eigenständige Funktion schreiben, obwohl Sie in diesem Fall wahrscheinlich die guten / schlechten Wörter in die Funktion einspeisen möchten, wenn Sie anrufen es (oder hart Code sie dort dauerhaft), aber das hängt davon ab, wie Sie sie ableiten ...

%Vor%

Ausgabe

Die obigen Funktionen werden nacheinander mit den im ersten Beispiel gezeigten Eingabe- und Wortlisten ausgeführt:

%Vor%

Natürlich werden die Ersatzwörter zufällig ausgewählt. Wenn ich also die Seite aktualisieren würde, würde ich etwas anderes bekommen ... Aber das zeigt, was / wird nicht ersetzt.

N.B.

Escaping $bad_words

%Vor%

Wortgrenzen \b

In diesem Code habe ich \b , \s und ^ oder $ als Wortgrenzen verwendet, es gibt einen guten Grund dafür. Während white space , start of string und end of string alle Wortgrenzen sind, wird \b nicht in allen Fällen übereinstimmen, zum Beispiel:

%Vor%

Dies liegt daran, dass \b mit Nicht-Wort-Zeichen (d. h. [^a-zA-Z0-9] ) übereinstimmt und Zeichen wie $ nicht als Wort Zeichen zählen.

Verschiedenes

Abhängig von der Größe Ihrer Wortliste gibt es ein paar potentielle Schluckauf. Aus Sicht des Systemdesigns ist es in der Regel schlecht, aus mehreren Gründen große Regexes zu haben:

  1. Es kann schwierig sein, zu warten
    1. Es ist schwer zu verstehen, was es tut
    2. Es ist schwierig, Fehler zu finden
  2. Es kann intensiv sein, wenn die Liste zu groß ist

Da das Regex-Muster von PHP kompiliert wird, wird der erste Grund negiert. Die zweite sollte ebenfalls negiert werden; Wenn deine Wortliste groß mit einem Dutzend Permutationen jedes schlechten Wortes ist, empfehle ich dir, zu stoppen und deine Vorgehensweise zu überdenken (lies: use ein Markierungs / Moderationssystem).

Um zu verdeutlichen, sehe ich kein Problem mit einer kleinen Wortliste , um bestimmte Kraftausdrücke herauszufiltern, da sie einen Zweck erfüllt: den Benutzer daran zu hindern, einen Ausbruch zu haben; Das Problem tritt auf, wenn Sie versuchen, zu viel einschließlich Permutationen herauszufiltern. Bleiben Sie dabei, gängige Schimpfwörter zu filtern, und wenn das nicht funktioniert, dann - zum letzten Mal - implementieren Sie ein Markierungs / Moderationssystem.

    
Steven 14.10.2013 21:14
quelle
4

Ich kam zu dieser Methode und es funktioniert gut. Rückgabe von true , falls im Eintrag ein ungültiger Eintrag vorhanden ist.

Beispiel:

%Vor%

Verwendung:

%Vor%

Da das Wort "schlecht" auf der schwarzen Liste steht, wird es echo.

Online-Beispiel 1

EDIT 1:

Wie von rid angeboten, ist es auch möglich, einfach in_array check:

zu machen %Vor%

Online-Beispiel 2

EDIT 2:

Wie ich versprochen habe, bin ich auf die etwas andere Idee gekommen, schlechte Worte durch gute Worte zu ersetzen, wie Sie in Ihrer Frage erwähnt haben. Ich hoffe, es wird dir ein wenig helfen, aber das ist das Beste, was ich im Moment anbieten kann, da ich mir absolut nicht sicher bin, was du zu tun versuchst.

Beispiel:

1. Lassen Sie uns ein Array mit schlechten und guten Wörtern zu einem kombinieren

%Vor%

2. Ihre imaginäre Benutzereingabe

%Vor%

3. Ersetzen Sie schlechte Wörter durch gute Worte

%Vor%

4. Gewünschte Ausgabe erhalten

  

Rollen in der Tiefe

     

Es beginnt ein Feuer in meinem Herzen   Erreicht ein Fieber, und es bringt mich aus der Dunkelheit   Endlich kann ich dich kristallklar sehen   Fahre fort und verkaufe mich und ich werde dein Schiff freilegen

Online-Beispiel 3

EDIT 3:

Um dem richtigen Kommentar von Wrikken zu folgen, habe ich völlig vergessen, dass strtr Groß- und Kleinschreibung unterscheidet und dass es besser ist, der Wortgrenze zu folgen. Ich habe das folgende Beispiel aus dem PHP: strtr - Handbuch ausgeliehen und leicht modifiziert.

Gleiche Idee wie in meiner zweiten Bearbeitung, aber nicht registerabhängig, es sucht nach Wortgrenzen und setzt einen Backslash vor jedes Zeichen, das Teil der regulären Ausdruckssyntax ist:

1. Methode:

%Vor%

2. Ein Array mit schlechten und guten Wörtern

%Vor%

3. Ersatz

%Vor%

Online-Beispiel 4

    
Ilia Rostovtsev 14.10.2013 11:24
quelle