Formular auf Inhalt überprüfen

CreativPur

Erfahrenes Mitglied
Ich möchte ein Formular (textareafelder) auf folgenden Inhalt überprüfen lassen.
  • Anstößige Textinhalte
  • Rassistische Äußerungen
  • Beleidigungen von Personen
  • Pornografische und sexuelle Anstöße
Ich denke mal, dass ich Eine Liste mit fraglichen Wörtern anlegen muss, um diese mit dem Formular abzugleichen.

Sollte eine Übereinstimmung stattfinden, sollte eine Fehlermeldung darauf hingewiesen werden und das Formular nicht abgeschickt werden.

Mir fehlt allerdings die Idee, wie ich dies am besten umsetze.

Über einen Gedankenanstoß wäre ich sehr dankbar.
 
Vielen Dank für den Anstoß

Ich habe es so zum teil lösen können...

Mein Formular
HTML:
<form action="test2.php" method="post">
    <div class="mb-3">
        <hr />
        <textarea class="form-control" id="exampleFormControlTextarea1" rows="3" name="positiv_1"></textarea>
        <br />
        <textarea class="form-control" id="exampleFormControlTextarea1" rows="3" name="negativ_1"></textarea>
        <br />
        <textarea class="form-control" id="exampleFormControlTextarea1" rows="3" name="vorschlag_1"></textarea>
        <hr />
        <button type="submit" class="btn btn-primary">Testen</button> 
    </div> 
</form>

Die Ausgabe
PHP:
<?php
include 'filter.string.class.php';

$filter_1 = new Filter_String;
$filter_1->strings = array('Nigger','Neger','geiler','geiles','geil','geilst','geile','Geil','supergeile', 'supergeiles', 'Schlampen', 'Schlamp', 'whore', 'bitch', 'sluts', 'fick', 'ficken', 'fickst', 'Ficker', 'Fickmöse',);
$filter_1->text = $_POST['positiv_1'];
$filter_1->keep_first_last = false;
$filter_1->replace_matches_inside_words = false;
$positiv_1 = $filter_1->filter();
echo $positiv_1;
echo '<br />'; 
  
$filter_2 = new Filter_String;
$filter_2->strings = array('Nigger','Neger','geiler','geiles','geil','geilst','geile','Geil','supergeile', 'supergeiles', 'Schlampen', 'Schlamp', 'whore', 'bitch', 'sluts', 'fick', 'ficken', 'fickst', 'Ficker', 'Fickmöse',);
$filter_2->text = $_POST['negativ_1'];
$filter_2->keep_first_last = false;
$filter_2->replace_matches_inside_words = false;
$negativ_1 = $filter_2->filter();
echo $negativ_1;
echo '<br />'; 

$filter_3 = new Filter_String;
$filter_3->strings = array('Nigger', 'Neger', 'geiler','geiles', 'geil', 'geilst', 'geile', 'Geil', 'supergeile', 'supergeiles', 'Schlampen', 'Schlamp', 'whore', 'bitch', 'sluts', 'fick', 'ficken', 'fickst', 'Ficker', 'Fickmöse',);
$filter_3->text = $_POST['vorschlag_1'];
$filter_3->keep_first_last = false;
$filter_3->replace_matches_inside_words = false;
$vorschlag_1 = $filter_3->filter();
echo $vorschlag_1; 
?>

Der Code filter.string.class.php

PHP:
<?php
class Filter_String  {

var $strings;
var $text;
var $keep_first_last;
var $replace_matches_inside_words;

function filter()
{
$new_text = '';

$regex = '/<\/?(?:\w+(?:=["\'][^\'"]*["\'])?\s*)*>/'; // Tag Extractor

preg_match_all($regex, $this->text, $out, PREG_OFFSET_CAPTURE);

$array = $out[0];

if(!empty($array))
{
    if($array[0][1] > 0)
    {
    $new_text .= $this->do_filter(substr($this->text, 0, $array[0][1]));
    }

   foreach($array as $value)
   {
   $tag = $value[0];
   $offset = $value[1];

   $strlen = strlen($tag);

   $start_str_pos = ($offset + $strlen);
   $next = next($array);

   $end_str_pos = $next[1];

   if(!$end_str_pos) $end_str_pos = strlen($this->text);


   $new_text .= substr($this->text, $offset, $strlen);


   $diff = ($end_str_pos - $start_str_pos);

       if($diff > 0)
       {
       $str = substr($this->text, $start_str_pos, $diff);

       $str = $this->do_filter($str);

       $new_text .= $str;
       }
   }
}
else
{
$new_text = $this->do_filter($this->text);
}

return $new_text;
}

function do_filter($var)
{
if(is_string($this->strings)) $this->strings = array($this->strings);

   foreach($this->strings as $word)
   {
      $word = trim($word);

      $replacement = '';

      $str = strlen($word);

      $first = ($this->keep_first_last) ? $word[0] : '';
      $str = ($this->keep_first_last) ? $str - 2 : $str;
      $last = ($this->keep_first_last) ? $word[strlen($word) - 1] : '';

      $replacement = str_repeat('*', $str);

      if($this->replace_matches_inside_words)
      {
         $var = str_replace($word, $first.$replacement.$last, $var);
      }
      else
      {
         $var = preg_replace('/\b'.$word.'\b/i', $first.$replacement.$last, $var);
      }
   }

return $var;
}

}
?>
 
Jetzt würde ich das array mit den Wörtern gern aus der Datenbank (db: Wortfilter, Tabelle: wort) entnehmen.
Leider bekomme ich dies nicht hin.
Außerdem habe ich den Wunsch, dass das versenden verhindert wird, wenn im Ausgabetext ein * erscheint, aber ein hinweiß zur Korrektur eingeblendet wird.
 
Mit der Datenbank habe ich folgendes versucht

PHP:
<?php
include 'filter.string.class.php';
include("inc/config.inc.php"); // Datenbank
   
$sql = "SELECT wort FROM Wortfilter";
$ausgabe = $pdo->query($sql)->fetch();
$wort = $ausgabe['wort'];  
   
$filter_1 = new Filter_String;
$filter_1->strings = array($wort);
$filter_1->text = $_POST['positiv_1'];
$filter_1->keep_first_last = false;
$filter_1->replace_matches_inside_words = false;
$positiv_1 = $filter_1->filter();
echo $positiv_1;
echo '<br />';  
   
$filter_2 = new Filter_String;
$filter_2->strings = array($wort);
$filter_2->text = $_POST['negativ_1'];
$filter_2->keep_first_last = false;
$filter_2->replace_matches_inside_words = false;
$negativ_1 = $filter_2->filter();
echo $negativ_1;
echo '<br />';  

$filter_3 = new Filter_String;
$filter_3->strings = array($wort);
$filter_3->text = $_POST['vorschlag_1'];
$filter_3->keep_first_last = false;
$filter_3->replace_matches_inside_words = false;
$vorschlag_1 = $filter_3->filter();
echo $vorschlag_1;  
?>

Die Spalte der Datenbank ist ein longtext, wo ich die Worte getrennt von Komma eingetragen habe.

1743264633171.png

Aber den Fehler finde ich nicht
 
Die Spalte der Datenbank ist ein longtext, wo ich die Worte getrennt von Komma eingetragen habe.
Keine gute Idee, so etwas macht man nicht.

Wie oft noch:

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
  10. Die Ausgaben per echo bzw. var_dump kann man sich ersparen, in dem man einen Debugger benutzt.
 

Neue Beiträge

Zurück