Schimpfwort filter für PHP erstellen?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.


Motfrager 
Beitragsersteller
 11.09.2018, 16:06

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

0
Babelfish  11.09.2018, 17:59
@Motfrager
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.

0