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!
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:
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 ...
Da Sie:
$bad_words
$good_words
Sie können PHP
s preg_replace_callback
function sehr einfach verwenden:
Okay, das preg_replace_callback
erstellt also ein Regex-Muster, das aus allen schlechten Wörtern besteht. Übereinstimmungen haben dann folgendes Format:
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 .
Sie könnten das oben genannte als einen Liner mit einer anonymen Funktion in preg_replace_callback
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%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.
$bad_words
\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:
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.
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:
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.
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.
EDIT 1:
Wie von rid angeboten, ist es auch möglich, einfach in_array
check:
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
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%Tags und Links php preg-replace wordpress preg-match