phpBuddy

Tipps & Tricks

PHP Profis von morgen finden hier diverse Tipps & Tricks zu immer wiederkehrende Hürden beim programmieren. Darüber hinaus werden auch weniger bekannte Funktionen anhand von kleinen Beispielen erklärt.

Sie sind hier: Startseite Quick Tip Index Badword Filter - unerlaubte Zeichen filtern
Badword Filter - unerlaubte Zeichen filtern

Badword Filter - unerlaubte Wörter unkenntlich machen

Fast überall wo Benutzer Kommentare veröffentlichen können ist es erforderlich entsprechende "böse Wörter" unkenntlich zu machen, ehe diese der Öffentlichkeit präsentiert werden. Für diesen Zweck setzt man einen sogenannten Badword Filter ein, wie es z.B. auch im phpBuddy.eu Gästebuch der Fall ist. Der Badword Filter ist eine Liste mit verbotenen Wörter, die für gewöhnlich entweder als Array, als externe Datei oder in einer Datenbank gepflegt und erweitert werden kann.

Als Amateur mag man denken das so ein Filter recht kompliziert ist. In Wirklichkeit ist es aber nicht mehr als eine einfache foreach-Schleife mit einer Zeile Code - zumindest bei relativ einfachen Filtern!

Schauen wir uns mal ein Beispiel an und besprechen hinterher kurz den Code.

$badword = array
(
    "hund",
    "wurst",
    "kochbuch",
);
 
$text = 'Der dumme Hund hat versucht das Bild von der Wurst aus dem Kochbuch zu fressen.';
 
foreach ($badword as $wort)
{
    $text = str_ireplace( $wort, str_repeat( "*", strlen( $wort ) ), $text);
}
 
echo $text;

In diesem Beispiel haben wir also ein Array und die einzelnen Elemente sind die bösen Worte, die wir nicht im Text haben möchten. Wie erwähnt, kann diese Wortliste auch aus anderen Quellen, wie Dateien oder einer Datenbank kommen. Wie fast immer üblich, durchlaufen wir das Array ($badword) in einer foreach-Schleife, um die einzelnen Elemente zu verarbeiten. In der Schleife suchen wir die bösen Wörter im Text und ersetzen diese durch Sternchen.
Diese Zeile mag etwas verwirrend aussehen, ist aber leicht zu verstehen. Die Funktion str_ireplace arbeitet identisch wie str_replace nur mit Unterschied, dass durch das zusätzliche i Case-Insensitive gearbeitet wird - oder zu deutsch: es wird Groß-/Kleinschreibung ignoriert. Gesucht wird also nach $wort, unser Array-Element, und ersetzt dieses mit einem Sternchen. Da es komisch aussehen würde, wenn ein Wort mit z.B. 5 Buchstaben durch nur 1 Sternchen ersetzt wird, machen wir Gebrauch von der PHP Funktion str_repeat. Diese Funktion wiederholt ein bestimmtes Zeichen oder ganze Texte und zwar so oft, wie es im 2. Parameter dieser Funktion vorgegeben wird. Um zu ermitteln wie oft also das Sternchen wiederholt werden muss, verwenden wir eine weitere String-Funktion von PHP, nämlich strlen. Dieser Funktion übergeben wir unser Badword in $wort und erhalten die Länge des Wortes als Zahl wieder. Diese Zahl übergeben wir str_repeat und somit weiß die Funktion, wie lang das original Wort war und durch wie viele Sternchen es ersetzt werden soll. Anschließend geben wir nur noch den Text in einer entschärften Version aus und das war's auch schon.

Hier noch ein Tipp, falls man eine externe Badword Liste pflegen möchte. Am besten macht man das, indem man eine beliebige Datei nimmt und je Zeile 1 Wort in die Datei schreibt. Z.B. könnte das der Inhalt von badword.txt sein:

hund
wurst
kochbuch

Statt die Datei nun mit fopen usw. zu öffnen, kann man die Datei direkt mittels file als Array einlesen:

$badword = file( 'badword.txt' );

So hat man die Datei sofort als Array verfügbar, bei der jede Zeile ein Array Element repräsentiert und spart sich das umständliche öffnen und zeilenweise einlesen der Datei.


Viel Spaß mit dem Badword Filter und bis zum nächsten Quick Tip,
phpBuddy


Eine live Demo und den vollständigen Code findest Du auf der phpBuddy.eu Demo Seite.