Wortzensur nicht für Images
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Also, der Code wird beim Anzeigen modifiziert, da gibt es kein [img], sondern nur <img>. BBCode wird ja in HTML umgerechnet, sonst kann es ja der Browser nicht anzeigen. Und da alles in < und > nicht ersetzt wird, ist eben der HTML-Code selbst davon nicht betroffen. Also sämtliche Links bleiben unzensiert, die lesbaren Texte, die ja außerhalb der HTML-Tags stehen, werden weiterhin zeinsiert. Wenn man einen Link direkt ins Posting schreibt wird im angezeigten Link das Wort zensiert, klickt man aber drauf, landet man trotzdem auf der richtigen Seite.
Wenn also ebay zensiert ist, würde www.zensurwort.de angezeigt werden, wenn man aber draufklickt, würde man trotzdem zu ebay gelangen. Man sieht beim Mausüberfahren des links diesen korrekten Link dann auch unten im Browser, wo die Links angezeigt werden (Beim IE z.B.).
Ob es durch diese Modifizierung mit Tricks möglich ist, Badwords darzustellen, weiss ich nicht. Aber das ist ja auch durch BBCode im Badword möglich, da versagt der herkömmliche Filter ja auch.
Wenn also ebay zensiert ist, würde www.zensurwort.de angezeigt werden, wenn man aber draufklickt, würde man trotzdem zu ebay gelangen. Man sieht beim Mausüberfahren des links diesen korrekten Link dann auch unten im Browser, wo die Links angezeigt werden (Beim IE z.B.).
Ob es durch diese Modifizierung mit Tricks möglich ist, Badwords darzustellen, weiss ich nicht. Aber das ist ja auch durch BBCode im Badword möglich, da versagt der herkömmliche Filter ja auch.
Achso, Du willst nur die Zensur bei Bildern abschalten, nicht bei Links allgemein. Für mich ist das nicht sehr sinnvoll, weil ein badwort in einem link nicht unbedingt auf einen unsauberen Inhalt der Website schließen lässt. Also wenn die Ausnahme nur auf Bilder wirken soll, müsste es so gehen:
Das habe ich jetzt aber nicht getestet.
Code: Alles auswählen
$message = preg_replace("/((<img[^>]*)|$orig_word)/e", '"\2"=="\1"? "\1":"$replacement_word"', $message);
also ich finde den gesuchten Code bei mir nicht
bei mir sieht das so aus:

bei mir sieht das so aus:
// Replace naughty words
//
if (count($orig_word))
{
$post_subject = preg_replace($orig_word, $replacement_word, $post_subject);
$post_extra = preg_replace($orig_word, $replacement_word, $post_extra);
if ($user_sig != '')
{
$user_sig = str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $user_sig . '<'), 1, -1));
}
$message = str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1));
}
//
Ich habe noch eine recht alte Boardversion, da sieht es halt noch anders aus. Ich habe jetzt keine Lust den regulären Ausdruck auseinanderzunehmen, was der macht. Kannst ja einfach:
durch meinen Code ersetzen. Aber vielleicht schaltet sich noch jemand ein, der genau weiß was diese Zeile macht. Ich denke, die macht genau das, was meine erste Version auch gemacht hat, badwords in HTML-Code verhindern.
Code: Alles auswählen
$message = str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1));
Also, es ist doch oft nicht ganz so einfach, wie es erst scheint. Einmal war das Problem, dass die Badwords in einem array liegen, aber der eigentliche Fehler lag daran, dass die badwordlist vorher schon modifiziert wird. Also es wird für das String-ersetzen schon was modifiziert. Ich hatte aber die eigentlichen badwords erwartet.
Ich habe nun beides ausprobiert, einmal mit den Bildern und einmal ohne. Hier der Code:
Man könnte das natürlich wieder in weniger Zeilen zusammenfassen und damit dann wieder einen schwer lesbaren regulären Ausdruck erzeugen. Aber ich glaube, so ist es besser!
Falls man nicht nur images zulassen will, sondern alle Links, entfernt man einfach das img aus $orig = "/((<img[^>]*)|".$orig.")/ie";
Ich habe beises ausprobiert und es funktioniert bei mir. Beim ersten mal hatte ich mich getäuscht, das lief auch bei mir nicht korrekt. Ob es mit der letzten Boardversion korrekt läuft weiß ich nicht, es kommt darauf an, wie die badwordlist in der Funktion obtain_word_list() aufbereitet wird.
Ich möchte erwähnen, dass mein Code natürlich nicht die optimale Lösung darstellt. Zeichen zu entfernen, die durch eine Funktion ersz hinzugefügt werden, ist nicht die feine Art. Man könnte eine zweite Funktion schreiben, die die unmodifizierte badwordlist zurückgibt. Aber ich glaube, dass ist es einfach nicht wert. Wenn es so geht, ist es doch ok. So viele Leute werden das nicht brauchen.
Falls es bei Deiner Boardversion nicht läuft, schreibe mir bitte welche Version Du hast, dann schaue ich mir den Code mal an.
Ich habe nun beides ausprobiert, einmal mit den Bildern und einmal ohne. Hier der Code:
Code: Alles auswählen
$m = 0;
while(isset($orig_word[$m])) {
$orig = str_replace("#\b(","",$orig_word[$m]);
$orig = str_replace(")\b#i","",$orig);
$orig = "/((<img[^>]*)|".$orig.")/ie";
$replace = '"\2"=="\1"? "\1":"'.$replacement_word[$m].'"';
$message = preg_replace($orig,$replace,$message);
$m++;
}

Falls man nicht nur images zulassen will, sondern alle Links, entfernt man einfach das img aus $orig = "/((<img[^>]*)|".$orig.")/ie";
Ich habe beises ausprobiert und es funktioniert bei mir. Beim ersten mal hatte ich mich getäuscht, das lief auch bei mir nicht korrekt. Ob es mit der letzten Boardversion korrekt läuft weiß ich nicht, es kommt darauf an, wie die badwordlist in der Funktion obtain_word_list() aufbereitet wird.
Ich möchte erwähnen, dass mein Code natürlich nicht die optimale Lösung darstellt. Zeichen zu entfernen, die durch eine Funktion ersz hinzugefügt werden, ist nicht die feine Art. Man könnte eine zweite Funktion schreiben, die die unmodifizierte badwordlist zurückgibt. Aber ich glaube, dass ist es einfach nicht wert. Wenn es so geht, ist es doch ok. So viele Leute werden das nicht brauchen.
Falls es bei Deiner Boardversion nicht läuft, schreibe mir bitte welche Version Du hast, dann schaue ich mir den Code mal an.
bei mir funtzt das nicht
vielleicht liegt es daran, dass ich dieses Snippet eingebaut habe:
http://www.phpbb.de/viewtopic.php?t=64639
damit werden gesperrte Wörter vorher abgefangen und können gar nicht gepostet werden...
habe Version 2.0.10
ich habe allerdings auch einige Mods drinnen...
mein Code sieht so aus:

vielleicht liegt es daran, dass ich dieses Snippet eingebaut habe:
http://www.phpbb.de/viewtopic.php?t=64639
damit werden gesperrte Wörter vorher abgefangen und können gar nicht gepostet werden...
habe Version 2.0.10
ich habe allerdings auch einige Mods drinnen...
mein Code sieht so aus:
// Replace naughty words
//
if (count($orig_word))
{
$post_subject = preg_replace($orig_word, $replacement_word, $post_subject);
$post_extra = preg_replace($orig_word, $replacement_word, $post_extra);
if ($user_sig != '')
{
$user_sig = str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $user_sig . '<'), 1, -1));
}
$m = 0;
while(isset($orig_word[$m])) {
$orig = str_replace("#\b(","",$orig_word[$m]);
$orig = str_replace(")\b#i","",$orig);
$orig = "/((<img[^>]*)|".$orig.")/ie";
$replace = '"\2"=="\1"? "\1":"'.$replacement_word[$m].'"';
$message = preg_replace($orig,$replace,$message);
$m++;
}
}
//
// If the board has HTML off but the post has HTML