Badwordfilter

phpameise

Mitglied
Wer hat Lust mir zu helfen?
Ich möchte meinen einfachen Badwordfilter etwas verändern.
Bisher wird jedes Zeichen dessen Badwords im array durch z.B. einen "*" ersetzt.
Es wäre perfekt, wenn nicht nur das Badword an sich durch Sterne ersetzt wird, sondern die Zeichenkette,
in der das Badword vorkommt, als Ganzes (bis zum nächsten Leerzeichen davor und danach) durch den neuen
String [...] ersetzt wird.
PHP:
<?php
function BadwordFilter($Text)
{
    $Badwords = array("234", "schirm", "@");
    foreach($Badwords as $Badword)
    {
        $Text = str_ireplace($Badword, str_repeat("*", strlen($Badword)), $Text);
    }
    return $Text;
}

$Text = BadwordFilter($Text);
?>
Bsp. für alter Text - neuer Text:
einen bildschirm kaufen - einen [...] kaufen
eine schirmmütze kaufen - eine [...] kaufen
eine bilschirmdiagonale messen - eine [...] messen
Telefon 1234 nutzen - Telefon [...] nutzen
adresse max.mustermann@web.de - adresse [...]

Ich bin wirklich gespannt und freue mich. Danke im Voraus.
 
Hallo,

hab mal was probiert:
PHP:
function maskword($word)
{
	$masked_word = "";
	for($i = 0; $i < strlen($word); $i++)
	{
		$masked_word .= "*";
	}
	
	return $masked_word;
}

function badwordfilter($text)
{
	global $badwords;
	
	$pattern = "=([-a-zA-Z0-9]*)(%s)([-a-zA-Z0-9]*)=ie";
	$replace = "maskword('$1$2$3')";
	
	$text_filtered = $text;

	foreach($badwords as $badword)
	{
		$text_filtered = preg_replace(sprintf($pattern, $badword), $replace, $text_filtered);
	}
	
	return $text_filtered;
}

$badwords = array("huhn", "zicke", "schwein", "trottel");

$text1 = "Hey, du altes Misthuhn. Hast du der Zicke von nebenan den Schweinehund ausgetrieben? Du Volltrottelidiot!";
$text2 = "Trottel! Siehst aus wie ein altes Warzenschwein";


echo "Original: ".$text1."<br />\n";
echo "Gefiltert: ".badwordfilter($text1)."<br /><br />\n";

echo "Original: ".$text2."<br />\n";
echo "Gefiltert: ".badwordfilter($text2)."<br /><br />\n";

Ausgabe:
Code:
Original: Hey, du altes Misthuhn. Hast du der Zicke von nebenan den Schweinehund ausgetrieben? Du Volltrottelidiot!
Gefiltert: Hey, du altes ********. Hast du der ***** von nebenan den ************ ausgetrieben? Du ****************!

Original: Trottel! Siehst aus wie ein altes Warzenschwein
Gefiltert: *******! Siehst aus wie ein altes *************
 
Vielen Dank, da bin ich ja meinem Ziel richtig viel näher gekommen. Ob es möglich ist anstatt für jedez gefilterte Zeichen durch einen Stern zu ersetzen das ganze Wort bzw die ganze zusammenhängende Zeichenkette durch ein "[...]" zu maskieren? Würde besser aussehen.
 
preg_replace() macht seinen Job doch ausgezeichnet..

PHP:
$string="Meine email-adresse ist chm@ekz.de. Ich bin ein Tollpatsch.";

$badwords=array(
   "/\s[\.a-z0-9]+@[a-z]+.[a-z]+(\.[a-z]+)?/i",
   "/tollpatsch/i"
);
$ersatz="(..)";

echo $string."<br/>";
$filtered=preg_replace($badwords, $ersatz, $string, -1 );

echo $filtered;
mfg chmee
 
Brauchst nur den Rückgabewert der maskword-Funktion anzupassen:
PHP:
function maskword($word) 
{ 
    /*
    $masked_word = ""; 
    for($i = 0; $i < strlen($word); $i++) 
    { 
        $masked_word .= "*"; 
    } 
     
    return $masked_word;
    */
    return "[...]"; 
}
 
Also allen die mir geholfen haben - D a n k e !
Ich hab jetzt wohl aus verschiedenen Ansätzen meine Traumvariante hinbekommen. Müsste funktionieren.

PHP:
<?PHP
$Text = $_POST['Text'];

function BadwordFilter($Text)
{
	$Badwords = array("sex", "040", "@");

    foreach($Badwords as $Badword)
    {
        $Text = preg_replace('/\S*(?:'.$Badword.'|\d{4,})\S*/i', '[...]', $Text);
    }
    return $Text;
}

$Text = BadwordFilter($Text);
?>
 
Zurück