Jens Irrgang: Zeilenumbrüche

Hallo an alle Forumler,

entweder ist die späte Zeit, oder aber mein Brett vor dem Kopf.
Ich suche eine Möglichkeit, mehrfache Zeilenumbrüche auszufiltern.
Jetzt habe ich schon die folgende Funktion gefunden:

$Text =~ s/[\n\r]+/<br>/g;

Damit werden mehrfach Zeilenumbrüche getilt. Soweit so gut. Damit werden aber alle bis auf einen gelöscht. Jetzt will ich aber zumindest zwei Zeilenumbrüche erlauben, damit Absätze wie oben mit einer freien Zeile möglich sind. Und damit beginnt mein Problem.
Ich habe einen Lösungsansatz gefunden, aber damit habe ich immer mindestens zwei Leerzeilen hintereinander.

Das ganze soll in einem Gästebuch zum Tragen kommen, damit Witzbolde nicht die Möglichkeit haben mir damit mein Gästebuch voll zu müllen (ok - ich weiß schon das es noch andere Möglichkeiten gibt).

Vielen Dank im voraus

Jens

  1. Hallo Jens,

    Mir fällt gerade nicht _die_ultimative regex ein. Ich würde das so machen

    hier wird mal tabula rasa gemacht. alle komischen Zeilenumbrüche weg.

    (muß das eigentlich sein, woeit ich weiß mach das perl implizit, aber sicher ist sicher)

    damit erreichen wir, daß jeder Zeilenumbrich aus genau einem Zeichen besteht

    $Text =~ s/\n\r/\n/g;
    $Text =~ s/\r\n/\n/g;

    mehr als 2 Zeileumbrüche lassen wir einfach nicht zu

    $Text =~ s/\n{3,}/\n\n/g;

    das Ergebnis könntest Du immer noch anderswitig verwenden, aber:

    $Text =~ s/\n/<br>/g;

    Sicherlich gibts da noch effizentere Methoden, aber was solls, so dürfte es wenigstens funktionieren

    Grüße
    Klaus

  2. Hi,

    Jetzt will ich aber zumindest zwei Zeilenumbrüche erlauben, damit Absätze wie oben mit einer freien Zeile möglich sind.

    my $umbruch = '(\015\012\015\012)';
    s/($umbruch{2})$umbruch+/$1/g;

    (ungetestet)

    Cheatah

    1. Hi JEns,

      my $umbruch = '(\015\012\015\012)';
      s/($umbruch{2})$umbruch+/$1/g;

      Also, siehst Du, es geht doch schlauer, aber ich hätte da noch eine ergänzung parat

      my $umbruch = '(\012\015\015\012\015\012)'; #alles ist möglich
      s/($umbruch{1,2})$umbruch+/$1/g;                  # und einen, aber nicht keinen,  wollen wir doch auch zulassen

      (ebenfalls ungetestet)

      Klaus

      1. Hallo allerseits,

        Hi JEns,

        my $umbruch = '(\015\012\015\012)';
        s/($umbruch{2})$umbruch+/$1/g;

        s/($umbruch{1,2})$umbruch+/$1/g;                  # und einen, aber nicht keinen,  wollen wir doch auch zulassen

        So matched RE bereits auf zwei $umbruch und ersetzt diese dann mit nur einem $umbruch. Bei einer "richtigen" Eingabe wuerde also die leere Zeile entfernt werden.

        (ebenfalls ungetestet)

        s/($umbruch{2})$umbruch+/$1/g;
        getestet - funktioniert !

        Klaus

        Gruss
           Kai

        1. Hallo,
          jo mei, waun ma net ois genau duachschaut, daun sch.. an eini.

          Woust recht host, host recht.
          Grüße
          Klaus

      2. Hi,

        my $umbruch = '(\012\015\015\012\015\012)'; #alles ist möglich

        nein, ist nicht. Im Zweifel reagiert diese Regexp bereits auf \r(\n\r)\n, was nicht das gewünschte Ergebnis erzielt - \012\015 kommt nicht vor.

        s/($umbruch{1,2})$umbruch+/$1/g;                  # und einen, aber nicht keinen,  wollen wir doch auch zulassen

        Siehe Kais Antwort :-)

        Cheatah

        1. »»  ... \012\015 kommt nicht vor.

          Bist Du Dir da so ganz sicher?
          Es gibt Systeme, wo '\n\r' vorkommen kann und solche , wo '\r\n' vorkommt. Siehe (MAc, PC, VMS, Unix...), jeder wills anders.

          Trotzdem würde ich, bevor ich HTML-Breaks einfüge, das ganze dahingehend korrigieren, daß nur mehr '\n' vorkommen. Alle Kombinationen würde ich zuerst wegfiltern. (Siehe meine erste Antwort)
          Das ist zwar langsamer, aber sicherer.

          Grüße
          Klaus

          1. Hi,

            »»  ... \012\015 kommt nicht vor.

            Bist Du Dir da so ganz sicher?

            ja.

            Es gibt Systeme, wo '\n\r' vorkommen kann

            Nenn mir bitte eins.

            Das genannte Pattern ist kampferprobt und wird von Profis verwendet. Es würde mich doch arg wundern, wenn diese im Laufe der Jahre den Fehler nicht bemerkt hätten.

            (MAc,

            \r

            PC,

            \r\n (Du meinst sicher Win *g*)

            VMS,

            \n AFAIK

            Unix...),

            \n

            Trotzdem würde ich, bevor ich HTML-Breaks einfüge, das ganze dahingehend korrigieren, daß nur mehr '\n' vorkommen. Alle Kombinationen würde ich zuerst wegfiltern. (Siehe meine erste Antwort)

            Also sinngemäß s!\r\n!\n!g; s!\r!\n!g; s!\n!<br>!g; ? Ich weiß ja nicht, wie das mit Dir ist, aber ich achte gelegentlich auch auf Performance... :-)

            Das ist zwar langsamer, aber sicherer.

            Nicht wirklich.

            Cheatah

            1. Hi,

              Nenn mir bitte eins.

              Na, zum Beispiel eben VMS. Ich weiß dieses OS ist ja eigentlich off-topic, aber rumschlagen muß ich mich auch damit

              Also sinngemäß s!\r\n!\n!g; s!\r!\n!g; s!\n!<br>!g; ?

              nein:

              hier wird mal tabula rasa gemacht. alle komischen Zeilenumbrüche weg.

              damit erreichen wir, daß jeder Zeilenumbrich aus genau einem Zeichen besteht

              $Text =~ s/(\015\012\012\015\015\012)/\n/g;

              mehr als 2 Zeileumbrüche lassen wir einfach nicht zu

              $Text =~ s/\n{3,}/\n\n/g;

              das Ergebnis könntest Du immer noch anderswitig verwenden, aber:

              $Text =~ s/\n/<br>/g;

              $umbruch = '(\015\012\012\015\015\012)';
              funktioniert allein schon deshalb genausogut, weil Perl ja versucht, die ersten optionen zuerst aufzulösen.
              (getestet)

              Ich weiß ja nicht, wie das mit Dir ist, aber ich achte gelegentlich auch auf Performance... :-)

              sicherlich achte ich auch auf die Performance, aber die Stabilität ist für mich immer wesentlicher.

              Das ist zwar langsamer, aber sicherer.

              Nicht wirklich.

              Probiers einfach aus.

              Klaus

  3. Danke an Cheatah, klaus und Kai,

    ich werde die gegebenen Antworten austesten. Vielen Dank für eure Antwort.