kostenloser Webspace werbefrei: lima-city


Wordfilter funktioniert nicht

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    mermadalis

    Kostenloser Webspace von mermadalis

    mermadalis hat kostenlosen Webspace.

    Hallo,

    Ich wollte für mein eigenes Gästebuch einen Wortfilter schreiben, der verhindern soll, dass anstößige Inhalte garnicht erst angezeigt werden, bzw. Posts, die anstößige Wörter beinhalten nicht ins Gästebuch aufgenommen werden.

    Hier der Quelltext:

    wordfilter.php:
    <?php
    	function WordFilter($text){
    		include("forbidden_words.php");
    		for ($i=0;$i<=$num;$i++)
    		{
    			$filter = $fw[$i];
    			if (preg_match("~$filter~Uis", $text))
    			{
    				echo '<link rel=stylesheet type="text/css" href="style.css">';
    				echo '<body>';
    				echo '<div class="joinus"></div>';
    				echo '<div class="alert_box">In den angegebenen Daten wurden verbotene Inhalte identifiziert! ';
    				echo "$text";
    				echo '</div>';
    				die ("</body>");
    			}
    		}
    	}
    ?>


    forbidden_words.php:
    <?php
    	$fw[1] = "[tT][eE][sS][tT];
    	
    	$num = count($fw);
    ?>


    Und die PHP-Datei, in der der Text gefiltert werden soll:
    <?php
    ...
    $beitrag = htmlspecialchars($_POST['beitrag']);
    $beitrag = nl2br($beitrag);
    WordFilter($beitrag); // Die Funktion WordFilter wird in der functions.php definiert
    ...


    Leider funktioniert das ganze nicht so richtig, denn der Wortfilter schlägt bei jeder Eingabe an (also sagt, dass in dem Wort verbotene Inhalte identifiziert wurden), auch wenn im Inhalt das zu filternde Wort, in diesem Fall "test", überhaupt nicht vorkommt.

    Wenn mir jemand helfen könnte, wäre das echt nett!

    MfG Mermadalis

    Beitrag zuletzt geändert: 30.7.2009 19:32:43 von mermadalis
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c****s

    Dein Array (der nicht initialisiert wurde) hat ein Element mit dem Index 1.

    Dein Schleife iteriert aber von 0 bis 1, da passt schon mal was nicht.

    Beim 0-ten durch lauf ist $filter = $fw [0] = null, damit ist deine Regex "~~Uis" und ich meine, eine leere Regex matcht auf alles. Deshalb werden alle Eingaben verboten
  4. Genau, Versuch einfach mal:

    <?php
    	$fw[1] = "[tT][eE][sS][tT];
    	
    	$num = count($fw);
    ?>

    in
    <?php
    	$fw[0] = "[tT][eE][sS][tT];
    	
    	$num = count($fw)-1;
    ?>

    umzuändern!

    LG cookies

    Beitrag zuletzt geändert: 30.7.2009 19:48:05 von cookies
  5. c****s

    Für was gibt es eigentlich in php ein foreach-Statement?

    wordfilter.php:
    <?php
    	function WordFilter($text)
    	{
    		include("forbidden_words.php");
    		foreach ($fw as $val)
    			if (preg_match("~$val~Uis", $text))
    			{
    				echo '<link rel=stylesheet type="text/css" href="style.css">';
    				echo '<body>';
    				echo '<div class="joinus"></div>';
    				echo '<div class="alert_box">In den angegebenen Daten wurden verbotene Inhalte identifiziert! ';
    				echo "$text";
    				echo '</div>';
    				die ("</body>");
    			}
    	}
    ?>



    forbidden_words.php:

    <?php
    	$fw = array ();
    	$fw ["gurkenscheibe"] = "[tT][eE][sS][tT]";
    	$fw ["voelligegal"] = "[Tt][iI][tT]{2}[Ee][Nn]";
    ?>


    Beitrag zuletzt geändert: 30.7.2009 19:53:11 von census
  6. Weiterhin hast du in deinem RegExp den Modifier "i" gesetzt. Damit ist das ganze case-insensitive. Du musst also nicht mehr "[Tt]" angeben sondern nur "T" oder nur "t".

    Zudem wäre es gut Strings zu beenden.
    Also statt
    $fw[1] = "[tT][eE][sS][tT];

    $fw[1] = "[tT][eE][sS][tT]";


    Also ergibt sich insgesammt:

    $fw[0] = "test";


    Wie bereits angemerkt: in allen Programmiersprachen beginnen Arrays bei 0 statt bei 1. Daher auch <count() statt <=count()...

    €dit: foreach dient einerseits dem Auslesen assoziativer Arrays bei denen der key benötigt wird:
    foreach($array as $key=>$value)
    Zudem finden es manche so bequemer als eine extra Iterierungsvariable zu nutzen. Weiterhin kann man foreach in Verbindung mit der SPL, also bei etwas komplexeren Iterationen, gut nutzen.

    Beitrag zuletzt geändert: 30.7.2009 19:55:49 von nikic
  7. c****s

    nikic schrieb:Wie bereits angemerkt: in allen Programmiersprachen beginnen Arrays bei 0 statt bei 1. Daher auch <count() statt <=count()...


    Ich gebe dir Recht, dass in einigen Sprachen, wie zum Beispiel C oder Java, Arrays grundsätzlich 0-based sind. Aber die Aussage gilt nicht für alle Sprachen. Gerade hier in PHP sind Arrays ja immer assoziativ, dass heißt sie können mit einem beliebigen Index beginnen, sei es 0, 1 oder "Apfelmus".

    Was richtig bleibt ist, dass man in der Regel von 0 bis Länge - 1 zählt, oder eben schlicht und ergreifend foreach benutzt.
  8. Aso, :D, ich hab dich ein wenig falsch verstanden. Oder eher, ich habe die User verwechselt. Ich dachte das mim foreach ist eine ernsthafte Frage :D Dann ist mein Edit natürlich ein wenig sinnlos...

    In welchen Sprachen wird denn, wenn nicht anders festgelegt, nicht automatisch mit der 0 begonnen?
  9. c****s

    nikic schrieb:
    Aso, :D, ich hab dich ein wenig falsch verstanden. Oder eher, ich habe die User verwechselt. Ich dachte das mim foreach ist eine ernsthafte Frage :D Dann ist mein Edit natürlich ein wenig sinnlos...

    In welchen Sprachen wird denn, wenn nicht anders festgelegt, nicht automatisch mit der 0 begonnen?


    Lua beginnt standardmäßig mit 1. Wenn ich mich nicht irre, auch ADA-95.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!