Seite 2 von 3

Verfasst: 12.11.2004 17:46
von makue
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.

Verfasst: 12.11.2004 17:56
von Kiss News
verstehe, dann ist das aber nix für mich, denn ich will ja Links weiterhin zensieren, nur Fotos eben nicht...

aber vielleicht könnte man dann das Umändern, dass alles zwischen www und jpg bzw. www und gif nicht zensiert wird, wäre das möglich?

Verfasst: 12.11.2004 18:23
von makue
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:

Code: Alles auswählen

$message = preg_replace("/((<img[^>]*)|$orig_word)/e", '"\2"=="\1"? "\1":"$replacement_word"', $message);
Das habe ich jetzt aber nicht getestet.

Verfasst: 12.11.2004 19:31
von Kiss News
also ich finde den gesuchten Code bei mir nicht :roll:

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));
}
//

Verfasst: 12.11.2004 20:05
von makue
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:

Code: Alles auswählen

$message = str_replace('\"', '"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1)); 
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.

Verfasst: 12.11.2004 22:56
von Kiss News
wenn ich das mache, macht das keinen Unterschied... habe einen Test gemacht, und ich konnte das Foto nicht posten :-?

Verfasst: 13.11.2004 08:03
von makue
Ähm, mir ist da ein Fehler unterlaufen. Die badwords stehen in einen array, ich muss das wohl in eine Schleife ändern. Ich melde mich wenn es klappt.

Verfasst: 13.11.2004 10:39
von Kiss News
OK, danke, wäre ja toll, wenn es wirklich klappen würde :)

Verfasst: 13.11.2004 10:50
von makue
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:

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++;
		}
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! :wink:

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.

Verfasst: 13.11.2004 11:19
von Kiss News
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:
// 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