Schimpfwort filter für PHP erstellen?
<?php
$string = "test lol sex";
$arr = explode(" ", $string);
$datei = fopen("test.txt","r+");
while(!feof($datei)) {
$zeile = fgets($datei,1000);
if(strpos($zeile, $string) !== false) {
$error = "true";
}
}
echo $error;
fclose($datei);
?>
In der Textdatei sind alle möglichen Schimpfwörter, darunter auch jetzt fürs Beispiel das Wort "sex"
Wie kann ich einen Schimpfwortfilter erstellen, der einen String durchsucht ob ein Schimpfwort vorhanden ist, aber Wörter wie "Recht'sex'perte" nicht erkennt, nicht auf Groß und Kleinschreibung achtet usw.
Das was ich bis jetzt schon habe klappt leider nicht :/
2 Antworten
Du könntest deinen String in Kleinbuchstaben umwandeln (strtolower) den Text an allen Leer- und Trennzeichen aufspalten, und die Levenshtein-Distanz der einzelnen Teilstrings zu den Einträgen in deiner Schimpfwortliste berechnen.
Damit würdest du dann auch Dinge wie "s*x" o. ä. filtern können.
Beispiel:
<?php
define('WORDS', 'test lol sex');
define('TEXT', 'Das ist ein sexy T*st für Rechtsexperten und Linksextremisten.');
$words = explode(' ', WORDS);
$text = preg_split('/[\s.,!?]+/', strtolower(TEXT));
print_r($words);
print_r($text);
$found = array();
foreach ($text as $t) {
if (empty($t)) {
continue;
}
foreach ($words as $w) {
$dist = levenshtein($t, $w);
if ($dist <= intval(strlen($t) / 4)) {
$found[] = $t;
}
echo $t . ' + ' . $w . ' = ' . $dist . "\n";
}
echo "\n";
}
echo "FOUND:\n";
foreach ($found as $f) {
echo $f . "\n";
}
Das liefert am Ende folgende Ausgabe:
FOUND:
sexy
t*st
Wie du das jetzt letztendlich genau nutzen willst, bleibt dir überlassen. Ich würde z. B. noch die Prüfung des Werts von "strlen($t) / 4" anpassen. Ich hab mir das jetzt nur nach Gutdünken aus den Fingern gesogen ... aber da gibts bestimmt noch weit optimalere Werte. :)
Naja, egal, ist nur so eine Idee ... :)
Verwende einen regulären Ausdruck. So einen kannst du in einer Funktion, wie preg_match_all, nutzen.
Mit strpos() klappt es genauso wie mit nem regulären ausdruck
Nein, damit klappt es eben nicht genauso. Mit strpos hast du das von dir angesprochene Problem, welches du mit Regulären Ausdrücken elegant umgehen kannst.
Mit strpos() klappt es genauso wie mit nem regulären ausdruck nur dass die strpos() methode doppelt so schnell ist
Mein Problem ist eher das mit einem Array zu überprüfen, also dass jedes einzelne Wort durchgegangen wird; bzw. ohne Array: der String durchsucht wird