Seite 1 von 3

Frage zu regulären Ausdrücken in Wortzensur

Verfasst: 05.02.2006 02:38
von smaugilein
Hallo,

ich habe mir die Wortzensur in eine "Worterklärung" umgebastelt, indem ich in der functions.php anstatt

Code: Alles auswählen

$orig_word[] = '#\b(' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . ')\b#i';
$replacement_word[] = $row['replacement'];
folgendes geschrieben habe:

Code: Alles auswählen

$orig_word[] = '/' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '/i';
$replacement_word[] = '<acronym title="' . $row['replacement'] . '" style="border-bottom:1px dotted #cc0000;padding:0px">' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '</acronym>';
Zur Erklärung: Durch diese Änderung werden Wörter in der Wortzensur nicht mehr mit einem anderen ersetzt, sondern erhalten durch die Variable "replacement" eine Begriffserklärung - sie werden rot unterstrichen und beim Mauszeigerdraufhalten kommt der Erklärungstext.
Das funktioniert wunderbar - nur habe ich das Problem, dass auch Internet-Adressen ersetzt werden und somit nicht mehr anklickbar werden.

Da ich mich mit regulären Ausdrücken nicht ganz so auskenne und gerade über eine Stunde erfolglos damit verbracht habe zu versuchen, etwas vernünftiges zustande zu bringen, dachte ich mir, ich frage euch mal! :)

Gibt's einen Tipp, was ich einbauen könnte? Die Ausdrücke in der bbcode.php helfen mir auch nicht wirklich weiter, weil ich da überhaupt nicht mehr durchblicke...! :cry:

Verfasst: 05.02.2006 03:20
von Pyramide
Wenn du die \b (Word boundary, d.h. Anfang bzw. Ende eines Wortes) wieder einfügst, sollte es wie gewünscht funktionieren:

Code: Alles auswählen

$orig_word[] = '/\b' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '\b/i'; 

Verfasst: 09.02.2006 20:06
von smaugilein
Klappte nicht wirklich. In Links wurde trotzdem noch der Wortfilter angewandt.

Ich hab's jetzt so gemacht:

Code: Alles auswählen

$orig_word[] = '/[^.]' . $row['word'] . '/i';
$replacement_word[] = '<acronym title="' . $row['replacement'] . '" style="border-bottom:1px dotted #cc0000;padding:0px">' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '</acronym>';
Das funktioniert soweit, nur wird immer, wenn z.B. das Wort "Avatar" erkannt wird, das Zeichen vor Avatar "verschluckt". Weiß jemand, wieso? Kann doch nicht so ein großer Fehler sein, oder? :)

Beispiel:
Meine Wenigkeit hat geschrieben:Ein Avatar, viele Avatare, weiteres unter www.avatar.de und vieles mehr! Auch ein Blavatarspiel wäre toll!
Ergebnis:
Mein phpBB hat geschrieben:EinAvatar, vieleAvatare, www.avatar.de und vieles mehr! Auch ein BAvatarspiel!
(Das unterstrichene erscheint - durch meine CSS-Angabe - rot gestrichelt unterstrichen, der Link erscheint ganz normal, was ja auch richtig ist! :))

Verfasst: 11.02.2006 07:26
von MagMo
Hi,

daß ein Zeichen vorher verschluckt wird, ist zu erwarten. Mit dem Code

Code: Alles auswählen

$orig_word[] = '/[^.]' . $row['word'] . '/i';
legst du fest, daß ein beliebiges Zeichen jedoch kein Punkt plus das gesuchte Wort ersetzt werden soll.

Du musst das voranstehende Zeichen in dein Replacement übernehmen. Versuch mal folgendes:

Code: Alles auswählen

$orig_word[] = '/([^.])' . $row['word'] . '/i';
$replacement_word[] = '\\1<acronym title="' . $row['replacement'] . '" style="border-bottom:1px dotted #cc0000;padding:0px">' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '</acronym>';
Grüße
MagMo

Verfasst: 11.02.2006 12:48
von smaugilein
Ja, DAS ist doch mal wunderbar! Tiptop! Klappt! Danköchöön! :grin:

Kurze Frage noch gen Ende: Kann man auch irgendwo sagen, dass in dem Wort kein Slash vorkommen darf?

Wenn man (wie oben) avatar erklären möchte, dann aber einen Link wie z.B.

www.meineseite.de/images/avatars/...

hat, dann wird der Link zerstört. Das ist aber ein kleineres Problem - damit könnte ich auch leben! :)

Verfasst: 11.02.2006 13:01
von MagMo
Hi,
smaugilein hat geschrieben:Kurze Frage noch gen Ende: Kann man auch irgendwo sagen, dass in dem Wort kein Slash vorkommen darf?

Wenn man (wie oben) avatar erklären möchte, dann aber einen Link wie z.B.

www.meineseite.de/images/avatars/...

hat, dann wird der Link zerstört. Das ist aber ein kleineres Problem - damit könnte ich auch leben! :)
Kein Problem. Dann musst du den Part mit dem du den Punkt als vorangehendes Zeichen ausschließt um den Slash erweitern. Da du den regulären Ausdruck mit dem Slash als Trennzeichen eingrenzt, musst du dort gleichzeitig den Slash durch z.b. die Raute ersetzen. Sonst klappt das ganze nicht. Dein regulärer Ausdruck muss als wie folgt aussehen:

Code: Alles auswählen

$orig_word[] = '#([^./])' . $row['word'] . '#i';
Grüße
MagMo

Verfasst: 11.02.2006 13:08
von smaugilein
Mmmh, klappt nicht ganz wie gewollt. Irgendwie muss ich doch da mit Leerzeichen arbeiten, da in w3-Adressen keine Leerzeichen vorkommen... aber es steht ja auch nicht immer ein Leerzeichen am Anfang. Was tun? :-)

(P.S.: Danke schon mal für die viele Antworterei!)

Verfasst: 11.02.2006 13:16
von smaugilein
Leerzeichen sind \s, das weiß ich schon. :)
Das pure Ersetzen des Slashes

Code: Alles auswählen

$orig_word[] = '#([^.\s])' . $row['word'] . '#i';
Klappt aber noch nicht wie gewünscht... Hilfe? :)

Verfasst: 11.02.2006 13:20
von MagMo
Hi,

schreib mal den . hinter den /

Code: Alles auswählen

$orig_word[] = '#([^/.])' . $row['word'] . '#i';
Wüsste jetzt nicht, warum das nicht funktionieren sollte.
smaugilein hat geschrieben:Was gebe ich ein, wenn im Wort kein Leerzeichen vorkommen darf?
???
Bin jetzt etwas überfragt wie du das meinst. Weil bis jetzt prüfst du nur das Zeichen vor dem "Zensurbegriff". Gib am besten mal ein Beispiel zur Veranschaulichung wie du das meinst.

Grüße
MagMo

Verfasst: 11.02.2006 13:23
von smaugilein
Hier ein Screenshot - da zeigt sich sofort, wo ersetzt werden darf und wo nicht! :)

[ externes Bild ]

Im Wort ("Klavatarbild" - was auch immer das ist :-D) darf's ruhig ersetzt werden, bei www.test.de/meinavatar/ nicht!