Frage zu regulären Ausdrücken in Wortzensur

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Frage zu regulären Ausdrücken in Wortzensur

Beitrag 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:
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag 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'; 
KB:knigge
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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! :))
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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! :)
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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!)
Zuletzt geändert von smaugilein am 11.02.2006 13:17, insgesamt 1-mal geändert.
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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? :)
Zuletzt geändert von smaugilein am 11.02.2006 13:20, insgesamt 1-mal geändert.
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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!
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Antworten

Zurück zu „Coding & Technik“