Alexander R.: \n 2 «br»-Converter

Hallo,

ich hab mal wieder ein kleines Problem: Und zwar benutze ich eine Textdatenbank.
Dafuer brauche ich die Eingabe eines _mehrzeiligen_ Eingabefelds.
Um jedoch die Datensaetze noch gebrauchen zu koennen (wegen der eventuellen Zeilenumbruech im Feld) brauche ich einen "\n" to <br>-Converter (also alle \n, new lines zu <br>s).

Ich hab schon alle moeglichen Varianten mit regulaeren Ausdrucken ausprobiert, aber es klappt nicht! :(

also so ungefaehr:

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

Ist dringend, danke fuer Eure Hilfe!

-Alex

  1. Hi!

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

    Das ist so richtig. Das Problem muss woanders liegen. Ohne weitere Informationen kann man da aber wohl nichts sagen.

    So lange

    1. Hi!

      $text_to_convert =~ s/\n/
      /g;

      Das ist so richtig. Das Problem muss woanders liegen. Ohne weitere Informationen kann man da aber wohl nichts sagen.

      So lange

      Ich kann Dir hoechstens mal den Code "drumherum" geben:

      sub convert_newlines {
        
        $text_to_convert = $_[0];
        
        $text_to_convert =~ s/\n/<br>/g;
        
        return $text_to_convert;
      }

      $news = &convert_newlines($PARAM{'news'});

      @news = reverse(@news);
      push(@news,"$id&&$topic&&$news&&$memberid&&$short_date&&$time_var&&none");
      @news = reverse(@news);
          
      &write_news;

      --------

      Wenn ich jetzt im Feld "news" (siehe oben, variable $PARAM{'news'})
      mehrzeiligen Text eingebe, soll das in das File geschrieben werden:

      ...&&zeile1<br>zeile2&&...

      aber stattdessen kommt das:

      ...&&zeile1
      <br>zeile2
      <br>zeile3&&..

      also die \n's werden nicht richtig entfernt! :(

      oder seh ich das nur falsch? ich probiers mal kurz aus... nein geht nicht! :((

      -Alex

      1. Hi Alex!

        sub convert_newlines {
          $text_to_convert = $_[0];
          $text_to_convert =~ s/\n/<br>/g;
          return $text_to_convert;
        }

        Das ist, wie gesagt, i.O. Vielleicht solltest Du noch mit
            my $text_to_convert;
        am Anfang der Funktion die Variable lokal machen. Man sieht dann die Variable ausserhalb der Funktion nicht. Ist einfach sauberer.

        $news = &convert_newlines($PARAM{'news'});

        Ich nehme an, das ist die Abfrage eines CGI-Parameters, also letztlich das Auslesen eines Forumlarinhaltes?

        @news = reverse(@news);
        push(@news,"$id&&$topic&&$news&&$memberid&&$short_date&&$time_var&&none");
        @news = reverse(@news);

        Mir scheint, Du willst hier den String am Anfang von @news hinzufuegen? Schau Dir mal den Befehl unshift() an, der ist gerade dafuer gedacht. Also
            unshift(@news, "$id...");

        ...&&zeile1<br>zeile2&&...

        aber stattdessen kommt das:

        ...&&zeile1
        <br>zeile2
        <br>zeile3&&..

        also die \n's werden nicht richtig entfernt! :(

        Mmh... Vielleicht sind da noch andere Zeichen, naemlich \r drin? Wenn Du z.B. das Formular von einem Windows-PC aus abschickst, dann codiert der Zeilenumbrueche mit CR-LF (weisst Du was das heisst?), was den Zeichen \x0D\x0A entspricht. Ein \n ist aber nur ein \x0A. D.h. Du erhaelst eine String mit

        zeile1\x0D\x0Azeile2

        und nach Deiner Substitution \n (== \x0A) nach <br> hast Du

        zeile1\x0D<br>zeile2

        Jenachdem, mit welchem Programm das dann dargestellt wird, wird das CR (\x0D) als normaler Zeilenumbruch interpretiert und dargestellt.

        Loesung: Vorher (vor dem Ersetzen mit <br>) \x0D\x0A nach \x0A umwandeln:

        $text_to_convert =~ s/\x0D\x0A/\x0A/;

        Ist natuerlich nur ne Vermutung, also probiers einfach mal aus.

        So lange, Calocybe

    2. Hi,

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

      Das ist so richtig.

      nö, ist es nicht:

      s/n/<br>/sg;

      Das /s am Schluß ist wichtig, weil sonst alle (tadaa) \n ignoriert werden. Idealerweise schreibst Du übrigens:

      s/\015\012\015\012/<br>/sg;

      wegen unterschiedlicher Umbrüche bei unterschiedlichen Betriebssystemen.

      Cheatah

      1. Moin Cheatah!

        s/n/<br>/sg;

        Das /s am Schluß ist wichtig, weil sonst alle (tadaa) \n ignoriert werden.

        Nee, der s-Modifier bezieht sich nur darauf, ob der '.', der ja fuer ein beliebiges Zeichen steht, aber eben doch nicht ganz, auch ein \n matcht. Das tut er naemlich nur, wenn /s angegeben wird.

        »»  Idealerweise schreibst Du übrigens:

        s/\015\012\015\012/<br>/sg;

        Wir hatten das ja schon mal, Du erinnerst Dich? Wo ich noch etwas skeptisch bin ist, ob denn der Ausdruck wirklich zuerst auf ein \015\012 insgesamt losgeht, nicht dass er bei einem CRLF zwei Matches erkennt und also zwei <br>'s einsetzt. Hast Du das mal ausprobiert? Ansonsten ist das wohl wirklich die beste Variante.

        So lange

        1. Hi,

          Das /s am Schluß ist wichtig, weil sonst alle (tadaa) \n ignoriert werden.

          Nee, der s-Modifier bezieht sich nur darauf, ob der '.', der ja fuer ein beliebiges Zeichen steht, aber eben doch nicht ganz, auch ein \n matcht. Das tut er naemlich nur, wenn /s angegeben wird.

          schuldig, Euer Ehren, da hatte ich eine erweiterte Bedeutung in Erinnerung.

          s/\015\012\015\012/<br>/sg;

          Wir hatten das ja schon mal, Du erinnerst Dich? Wo ich noch etwas skeptisch bin ist, ob denn der Ausdruck wirklich zuerst auf ein \015\012 insgesamt losgeht, [...]

          Jepp. Dies ist aber die in de.comp.lang.perl.* empfohlene Methode (alle übrigen werden von irgendwem zu obiger korrigiert); und aufgrund der Zahl der Experten dort (sowie deren Erklärungen warum und weshalb) bin ich geneigt, das auch ohne Multi-OS-Tests zu glauben :-)

          Cheatah

        2. Danke alle zusammen :) Is ein cooles Forum hier :) Prompte Antworten! :)

          Werd alles mal ausprobieren! Thx

          -Alex

          1. Es klappt wunderbar! Danke.

            -Alex

    3. Hi,

      $text_to_convert =~ s/\n/

      Fuer Timothy:

      <?php
      $converted_text=nl2br($text_to_convert);
      ?>

      SCNR

      Jan

      PS: Das sagt wieder nix ueber die "bessere" Sprache aus, nur merkt man daran, dass PHP fuer das Web geschrieben wurde.

      1. PS: Das sagt wieder nix ueber die "bessere" Sprache aus, nur merkt man daran, dass PHP fuer das Web geschrieben wurde.

        1 : 1   ;-)

        Timothy

        P.S. Ich weiß auch, das solche Kurzpostings nicht erwünscht sind.

        Trotzdem:  Bitte keinen Bannstrahl gegen mich.