![](https://images.gutefrage.net/media/user/Motfrager/1463478687847_nmmslarge__220_398_1218_1218_2701208409841896167e68713c978252.jpg?v=1463478688000)
![](https://images.gutefrage.net/media/default/user/1_nmmslarge.png?v=1438863662000)
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 ... :)