Christoph Schnauß: reguläre Ausdrücke in Forumscript

guten Abend ;-)

Ich komme an einer (für mich) sehr eigenartigen Stelle in éinem Forum-Script nicht weiter. Es geht mir um die "modernisierte Fassung" des alten Matt-Wright-Scripts, wie man es sich bei http://nms-cgi.sourceforge.net besorgen kann. Der Grund: ich habe mehrere Foren immer noch mit der noch älteren Fassung, in der es noch nichtmal "use strict" gab, laufen und will die nun endlich mal modernisieren.

Mein bisheriges Script erlaubt  -  genauso wie das SELFHTML-Forum  -  das Einbinden von Textlinks und Grafiklinks in der Form <...> bzw . Verantwortlich dafür sind Ersetzungen, die so aussehen:
      $edit =~ s/<(.?)]/<a href="$1">$1</a>/ig;
      $edit =~ s/[bild:(.
?)]/<img src="$1" alt="bild">/ig;
Das funktionierte in meiner "alten" Fassung ganz prima, ist allerdings weder im "ganz alten" Matt-Wright-Script vorgesehen, noch in der modernisierten Fassung bei nms-cgi.sourceforge.net.

Jetzt dachte ich mir, daß ich ja im Grunde genommen bloß diese regulären Ausdrücke "mitnehmen" und in die Neufassung einbauen muß. Pustekuchen ... Zwar gibts die entsprechenden Variablen, die den Inhalt der Textarea aufnehmen, nach wie vor, und ich kann auch mit
       $edit =~ s/</</g;
       $edit =~ s/>/>/g;
die Darstellung von HTML-tags erlauben/untersagen. Ich kann \n in <br /> umwandeln, ich kann die deutschen Umlaute korrigieren, so daß das Script valides XHTML erzeugt usw. Das deute ich so, daß ich die richtige Stelle gefunden habe, an der ich mit den RegExpressions herumwurschteln kann. Bloß mit den links, image-links (und iframe-links) kriege ich das nicht hin  -  wenn ich [link :http://pirgendwas...> eintrage, erscheint im posting ebenfalls [link :http://irgendwas ...], das heißt, da wird gar nix ersetzt (Anmerkung: damit das jetzt nicht anklickbar wird, mußte ich einen Zwischenraum bei "link :http" lassen).

Ich kriege auch keinerlei Fehlermeldung, kein log, gar nix, womit ich weiterarbeiten könnte.

Möglicherweise liegts daran, daß die "Neufassung" des Matt-Wright-Scrips ein eigenes Inline-Modul mitbringt, in dem gewissermaßen HTML "neu erfunden" wird. Bei dem Ding sehe ich aber noch nicht ganz durch, vielleicht kennt es ja einfach die eckigen Klammern nicht, aber gefunden hab ich eine entsprechende Stelle noch nicht.

Hat jemand irgendwelche Erfahrungen mit dem Teil und kann mir sagen, wie ich nun links, Grafiken und iFrames wieder "erlauben" kann? Solange das nicht erledigt ist, kann ich meine alten Forenscripts nicht durch eine zeitgemäßere Fassung ersetzen, weil sich meine Besucher inzwischen an dieses "Feature" gewöhnt haben und teilweise ausgiebig Gebrauch davon machen  -  im Gegensatz zu manchem "Newcomer" im Forum hier ;-)

Falls erforderlich, kann ich auch mal fix ein "Testforum" online stellen. Es lohnt bloß nicht, das _ganze_ PERL-Script hier zu posten, das sind knapp 700 Zeilen ...

Grüße aus Berlin

Christoph S.

  1. Hallo Christoph,

    Ich glaube zwar das ist ein Fehler in deinem Posting aber:

    $edit =~ s/<(.*?)]/<a href="$1">$1</a>/ig;

    ....................^
    clasht mit:

    [link :http://pirgendwas...>

    ........^

    An dem leerzeichen beist dein RegEx auf Granit.

    bye eddie

    1. hi,

      $edit =~ s/<(.*?)]/<a href="$1">$1</a>/ig;
      ....................^
      clasht mit:
      [link :http://pirgendwas...>
      ........^

      <seufz>
      Du hättest auch lesen sollen:
      (Anmerkung: damit das jetzt nicht anklickbar wird, mußte ich einen Zwischenraum bei "link :http" lassen).
      </seufz>

      Grüße aus Berlin

      Christoph S.

  2. N'abend Christoph,

    $edit =~ s/<(.*?)]/<a href="$1">$1</a>/ig;

    Ich habe diese Zeile jetzt mal in mein Test-Gästebuch eingefügt, allerdings so:

    $message =~ s/[link:(.*?)]/<a href="$1">$1</a>/ig;

    Es geht ... ([link:http://www.siechfreds-welt.de/cgi-bin/feedback.pl?pos=0>
    Kannst ja mal einen Testeintrag hinterlassen, es müsste funktionieren (Den Testeintrag werde ich dann löschen).

    Viele Grüße
    Torsten

    --
    Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
    1. hi,

      Ich habe diese Zeile jetzt mal in mein Test-Gästebuch eingefügt, allerdings so:
      $message =~ s/<(.*?)]/<a href="$1">$1</a>/ig;

      Wie die Variable heißt, ist ja auch unwichtig bzw. steht zur freien Wahl  -  im Original bei Matt Wright steht, glaube ich "$body".

      Es geht ... ([link:http://www.siechfreds-welt.de/cgi-bin/feedback.pl?pos=0>

      Na klar, hat ja in meinen "alten" Scripts jetzt auch über drei Jahre lang prima funktioniert. Deswegen finde ich es frustrierend, weshalb ich es in der Neufassung nicht mehr hinkriege.

      Kannst ja mal einen Testeintrag hinterlassen, es müsste funktionieren (Den Testeintrag werde ich dann löschen).

      Momentchen, bin auf dem Weg

      Grüße aus Berlin

      Christoph S.

      1. N'abend nochmal,

        $message =~ s/[link:(.*?)]/<a href="$1">$1</a>/ig;
        Wie die Variable heißt, ist ja auch unwichtig bzw. steht zur freien Wahl  -  im Original bei Matt Wright steht, glaube ich "$body".

        Ich habe den "" vor den " wegegelassen ...

        Viele Grüße
        Torsten

        --
        Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
        1. hi,

          ich kann nicht posten: "Fehlermeldung
          Fehler: Im Text sind nur Wörter bis zu einer Länge von Zeichen erlaubt".

          Da stimmt noch was andres in deinem Script nicht.

          Christoph S.

          1. Autsch,

            ich kann nicht posten: "Fehlermeldung
            Fehler: Im Text sind nur Wörter bis zu einer Länge von Zeichen erlaubt".
            Da stimmt noch was andres in deinem Script nicht.

            Nee, das ist so gewollt, habe wohl die maximale Wortlänge zu niedrig eingestellt ...
            Ich habe die Prüfung mal rausgenommen.

            Viele Grüße
            Torsten

            --
            Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
            1. hi,

              Ich habe die Prüfung mal rausgenommen.

              Ja, okay, jetzt hast du was gelernt, und bei dir funktiuonierts, aber bei mir nicht :-(
              Ich werd wohl doch mal nen Testscript online stellen müssen.

              Christoph S.

              1. N'abend,

                Ja, okay, jetzt hast du was gelernt, und bei dir funktiuonierts, aber bei mir nicht :-(

                Schau doch noch mal hier [pref:t=49615&m=271226].
                Deinen Eintrag werde ich wie versprochen löschen.

                Viele Grüße
                Torsten

                --
                Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
                1. ups ...

                  Schau doch noch mal hier [pref:t=49615&m=271226].

                  ok, PERL 5.6.1. Ich habe zum Testen hier auf meinem Rechner PERL 5.8.0 (ActivePERL unter WinXP, Server ist natürlich Apache), mein Provider hat PERL 5.8.0 mit IIS5 (!), ich fummle mal die Pfadangaben noch zurecht und stelle dann nen Testforum online.

                  Deinen Eintrag werde ich wie versprochen löschen.

                  Du kannst ihn gerne so lange stehen lassen, wie du an deinem Script noch arbeiten mußt/willst. Die Textarea würde ich zum Beispiel etwas größer machen.

                  Grüße aus Berlin

                  Christoph S.

        2. ähm ...

          Ich habe den "" vor den " wegegelassen ...

          vielleicht in deinem Script, aber nicht in deinem posting hier. Das _muß_ aber zu Serverfehlern führen, tuts bei mir jedenfalls. Welche PERL-Version hast du?

          Christoph S.

          1. N'abend,

            Ich habe den "" vor den " wegegelassen ...
            vielleicht in deinem Script, aber nicht in deinem posting hier. Das _muß_ aber zu Serverfehlern führen, tuts bei mir jedenfalls. Welche PERL-Version hast du?

            Perl 5.6.1.
            Btw, ich habe gerade mal auf http://www.perldoc.com gestöbert, aber nirgendwo gefunden, dass Anführungszeichen gequotet (ich glaube es heißt so) werden müssen, denn wenn nicht, liegt da dein Fehler.

            Viele Grüße
            Torsten

            --
            Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
            1. Nachtrag:

              Eben gefunden:

              Not all characters can be used 'as is' in a match. Some characters, called metacharacters, are
              reserved for use in regex notation. The metacharacters are:

              {}^$.|*+?\

              (Quelle: http://www.perldoc.com/perl5.8.0/pod/perlrequick.html)

              Die Anführungszeichen sind nicht dabei, also brauchst du auch kein "".

              Viele Grüße
              Torsten

              --
              Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
              1. wow,

                Not all characters can be used 'as is' in a match. Some characters, called metacharacters, are reserved for use in regex notation. The metacharacters are:
                    {}^$.|*+?\ (Quelle: http://www.perldoc.com/perl5.8.0/pod/perlrequick.html)

                ----------------------------------------^^^^^^^^^

                oh Mann, muß ich jetzt noch 'ne "PERL-Versions-Weiche" einbauen? Ich hab ja auf meinem Rechner zum Ausprobieren PERL 5.8 drauf.

                Die Anführungszeichen sind nicht dabei, also brauchst du auch kein "".

                Warum kriege ich dan Errormeldungen, wenn ich die Backslashes weglasse ?

                Grüße aus Berlin

                Christoph S.

                1. N'abend nochmal,

                  (Quelle: http://www.perldoc.com/perl5.8.0/pod/perlrequick.html)
                  ----------------------------------------^^^^^^^^^
                  oh Mann, muß ich jetzt noch 'ne "PERL-Versions-Weiche" einbauen? Ich hab ja auf meinem Rechner zum Ausprobieren PERL 5.8 drauf.

                  Das war in 5.6.1. genauso (http://www.perldoc.com/perl5.6.1/pod/perlrequick.html). Warum du dann eine Fehlermeldung bekommst, erscheint mir vor dem Hintergrund unlogisch, zumindest würde ich unter dieser Annahme vermuten, dass es nichts mit den " zu tun hat.

                  Viele Grüße
                  Torsten

                  --
                  Dieses Posting kommt ohne Garantie auf Vollständigkeit, Richtigkeit und Funktionalität. Geposteter Quelltext ist, soweit nicht anders angegeben, ungetestet.
  3. N'Abend Christoph,

    Ich weiß nicht, ob du das schon mal gemacht hast, aber ich hab das ganze mal schnell so getested, dh, ob der Regex überhaupt funktioniert. Bei mir perl 5.8.0 funktioniert das in einer einzeiler Version ohne Probleme.
    anarazel@andres:~/downloads/src/wwwboard$ perl -e 'use strict; my $edit="http://www.example.org";$edit =~ s/<(.*?)]/<a href="$1">$1</a>/ig;print $edit,"\n";'
    <a href="http://www.example.org">http://www.example.org</a>

    Also funktioniert das ganze, zumindest theoretisch. D.h. der Fehler muss irgendwo im Forenscript nicht im Regex selber liegen.

    Grüße Andres Freund

    --
    ss:) zu:) ls:} fo:) de:> va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
    1. guten Abend,

      ähm, ich blicke bei dem Zeilenumbruch, den du verwendet hast, nicht ganz durch.

      Bei mir perl 5.8.0 funktioniert das in einer einzeiler Version ohne Probleme.

      Ja, wenn ich mein Problem gewissermaßen "abstrahiere" und 2300 Zeilen Code weglasse, funktionieren diese regExpressions bei mir auch  -  unter WinXP genauso wie unter SuSE oder *BSD, mit Apache ebenso wie mit IIS, mit PERL 5.8.0 genauso wie mit PERL 5.6.3. Das Problem ist ja, daß ich sie in einem ziemlich komplexen Script einsetze, das "alles in allem" rund 2400 Zeilen hat  -  davon sind 700 Zeilen das eigentliche Script, der Rest besteht aus inline-Modulen.

      D.h. der Fehler muss irgendwo im Forenscript nicht im Regex selber liegen.

      Momentchen Geduld noch, ich fummle das Ganze jetzt doch mal so zusammen, daß ich es online stellen kann, mal schauen, was dann passiert. Bisher hab ich es nur auf meinem lokalen Rechner durchgespielt mit einem virtuellen host.

      Grüße retour

      Christoph S.

  4. Hallo,

    -  wenn ich [link :http://pirgendwas...] eintrage, erscheint im posting ebenfalls [link :http://irgendwas ...]

    Erscheint da wirklich http://wasauchimmer im HTML-Code oder nicht doch etwa &#91;link:http://wasauchimmer&#93;

    Ich denke das liegt alles in den Zeilen 367-372:
       unless ($allow_html) {
          # strip out what look like tags, then escape all but
          # wellformed HTML entities.
          $body =~ s#</?\w+[^>]*># #g;
          $body =~ s/(&#?\w{1,20};)|(.[^&]*)/ defined $1 ? $1 : $cs->escape($2) /ges;
        }
    Alles was danach passiert und auf [ abfrägt, ist hoffnungslos da es diesyes Zeichen nicht mehr gibt.

    Grüße
      Klaus

    1. hi Klaus,

      Ich denke das liegt alles in den Zeilen 367-372

      Und genau diese Zeilen hab ich einfach gestrichen, weil ich den "unless"-Fall ja gar nicht kalkulieren will. Ich gehe deinem Hinweis aber gerne nochmal gründlich nach.

      Grüße aus Berlin

      Christoph S.

  5. hallo,

    Ich habe jetzt mal ein "Testforum" online gestellt, das man sich unter http://www.christoph-schnauss.de/temp/testforum anschauen kann. Da gibts auch einen link zum gesamten eingesetzten Script.
    Das Problem, nach dem ich gestern gefragt hatte, habe ich beheben können  -  ich habe die RegExpressions einer anderen Variablen zugeordnet und die Variablen etwas anders aufgerufen, da gings dann.
    Wenn jemand Lust hat, das Ding mal zu testen, wäre ich ganz froh darüber.

    Grüße aus Berlin

    Christoph S.