Andreas-Lindig: ich kann \n\n nicht im regulären Ausdruck finden

Hallo Forum,

ich lese eine Textdatei aus in die vorher Gästebucheinträge geschrieben wurden (siehe Signatur). Nun hauen da Leute Leerzeilen rein und die will ich durch einen kleineren Absatz ersetzen. Das heißt: ich muß die doppelten Zeilenumbrüche finden und ersetzen. Mein Versuch klappt aber nicht:

preg_replace("/\n\n/","\n", $text);

ich habe hier als erstes mal versucht, doppelte Zeilenumbrüche durch einen zu ersetzen, aber sie werden gar nicht gefunden (obwohl es sie gibt - kontrolle im Texteditor mit der Cursurtaste, keine Leerzeichen dazwischen).

das z.B. funktioniert:
preg_replace("/\n/","hallo", $text);

also einzelne Zeilenumbrüche werden sehrwohl erkannt.
weiß jemand, was das ist?

Gruß, Andreas

  1. Hallo Andreas

    preg_replace("/\n\n/","\n", $text);

    Sollte so passen, bei mir funktionierte es. Vielleicht sind noch Leerzeichen oder so zwischen den \n drin? Hast Du mal den $text vor der Umwandlung ausgeben lassen?

    Teste mal bei Dir das bei Dir:

    <?php

    $text = "Hallo,\n\nwie gehts denn so?\n\nMir geht es gut!\nGruss Andre";

    echo( "<pre>" . $text . "</pre>" );

    $text_neu = preg_replace("/\n\n/","\n", $text);

    echo( "<pre>" . $text_neu . "</pre>" );

    ?>

    Gruss AndreD

  2. hi,

    Das heißt: ich muß die doppelten Zeilenumbrüche finden und ersetzen. Mein Versuch klappt aber nicht:
    preg_replace("/\n\n/","\n", $text);

    beachte, das windows und unix/linux zeilenumbrüche unterschiedlich darstellen - einmal nur \n, und einmal \n\r (oder war's andersherum?)

    mein tipp: wandle zuerst die zeilenumbrüche per nl2br() in <br /> um - und filtere dann doppelte vorkommen dieses tags raus.

    gruss,
    wahsaga

    1. Hallo wahsaga,

      Stimmt, daran hatte ich nicht gedacht. Wahrscheinlich nutzt Andreas ein Linuxsystem als Testumgebung, ich nutze Win2000 und deshalb funktionierte es wohl bei mir auch...

      mein tipp: wandle zuerst die zeilenumbrüche per nl2br() in <br /> um - und filtere dann doppelte vorkommen dieses tags raus.

      Guter Tipp!

      Gruss AndreD

      1. Hallo ihr beiden,

        Stimmt, daran hatte ich nicht gedacht. Wahrscheinlich nutzt Andreas ein Linuxsystem als Testumgebung,

        um Gottes Willen, ich bin doch kein Computerfachmann. So'n Bastlersystem kommt mir nicht auf den Schreibtisch ;) Ich habe Windows ME.
        Und Dein Beispiel funktioniert bei mir auch (also macht Windows wohl \n aus den Zeilenumbrüchen), nur in meinem eigenen Programm geht's komischerweise nicht.
        Ich habe jetzt die Methode von wahsaga genommen, obwohl die auch nicht so einfach geht: nl2br verwandelt \n nämlich in <br /> plus einen Zeilenumbruch. Man muß also THEORETISCH nach <br />\n<br /> suchen, aber was meinst Du? - geht nicht. Also suche ich jetzt dies: |<br />(\s)*<br />|U
        scheint zu gehen, aber ist doch merkwürdig, oder?

        Gruß, Andreas

        1. Hallo Andreas,

          Ich habe jetzt die Methode von wahsaga genommen, obwohl die auch nicht so einfach geht: nl2br verwandelt \n nämlich in <br /> plus einen Zeilenumbruch.

          dann verwende doch die Methode von CK:
          $txt = preg_replace("/(\015\012)|(\015)|(\012)/","<br />",$txt); //->http://de3.php.net/nl2br (nach 'CK1' suchen)
          (statt "<br />" kannst du natürlich auch was anderes einsetzen)

          Grüße aus Nürnberg
          Tobias

          --
          Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
        2. Hallo Andreas,

          um Gottes Willen, ich bin doch kein Computerfachmann. So'n Bastlersystem kommt mir nicht auf den Schreibtisch ;) Ich habe Windows ME.

          Bastlersystem ist gut :-) Mittlerweile gibts das ja auch mit grafischer Oberfläche für alle die nicht gerne basteln ;-)

          Und Dein Beispiel funktioniert bei mir auch (also macht Windows wohl \n aus den Zeilenumbrüchen), nur in meinem eigenen Programm geht's komischerweise nicht.

          Hast Du vielleicht in Deinem Programm eingestellt das er Textdateien im Unixformat speichern soll? Ultraedit32 bietet diese Option...

          Ich habe jetzt die Methode ...
          scheint zu gehen, aber ist doch merkwürdig, oder?

          Naja, wenns funktioniert... Schau Dir doch noch das von Tobias an, das ist recht gut mit dem Char-Code gelöst. Ich glaube bei Win oder Unix kommt bei einem Zeilenumbruch also einem \n auch noch ein \c für einen "Carriage Return" also Wagenrücklauf wie bei der Schreibmaschine hinzu... Und soweit ich das richtig sehe sucht die Methode von Tobias entweder nach dem einen oder anderen.

          Gruss AndreD

        3. Moin!

          Und Dein Beispiel funktioniert bei mir auch (also macht Windows wohl \n aus den Zeilenumbrüchen), nur in meinem eigenen Programm geht's komischerweise nicht.

          Nein. Das Zeichen "\n" ist im Beispielcode fest eingebaut worden. Deshalb wird es auch gefunden.

          Wenn aber ein Browser in einer Textarea ein Return sendet, hängt es vom System ab, ob das als "\n" oder als "\r\n" gesendet wird. Windows-Systeme senden "\r\n". Und wenn die so in der Datei gespeichert werden, findest du sie natürlich beim Auslesen wieder vor.

          Ich habe jetzt die Methode von wahsaga genommen, obwohl die auch nicht so einfach geht: nl2br verwandelt \n nämlich in <br /> plus einen Zeilenumbruch. Man muß also THEORETISCH nach <br />\n<br /> suchen, aber was meinst Du? - geht nicht. Also suche ich jetzt dies: |<br />(\s)*<br />|U

          Warum ärgerst du dich mit dem <br> rum? Suche doch einfach nach den diversen Zeilenumbruchalternativen:
          (\n|\r|\r\n){2} findet zwei Zeilenumbrüche.

          - Sven Rautenberg

          --
          ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
          1. Hi,

            Wenn aber ein Browser in einer Textarea ein Return sendet, hängt es vom System ab, ob das als "\n" oder als "\r\n" gesendet wird.

            Sollte es aber nicht. Sowohl für
            application/x-www-form-urlencoded
            als auch für
            multipart/form-data
            ist festgelegt, daß Zeilenumbrüche als CR LF zu übertragen sind.

            siehe http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4

            cu,
            Andreas

            --
            Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
            http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
            1. Moin!

              Wenn aber ein Browser in einer Textarea ein Return sendet, hängt es vom System ab, ob das als "\n" oder als "\r\n" gesendet wird.

              Sollte es aber nicht. Sowohl für
              application/x-www-form-urlencoded
              als auch für
              multipart/form-data
              ist festgelegt, daß Zeilenumbrüche als CR LF zu übertragen sind.

              "Sei konservativ in dem, was du sendest, und flexibel in dem, was du akzeptierst." Wer weiß schon, wieviele Browserprogrammierer diese Stelle gelesen haben. :)

              - Sven Rautenberg

              --
              ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
          2. Hallo Sven,

            Warum ärgerst du dich mit dem <br> rum? Suche doch einfach nach den diversen Zeilenumbruchalternativen:
            (\n|\r|\r\n){2} findet zwei Zeilenumbrüche.

            Eher (\015\012|\015|\012){2} (oder auch (\r\n|\r|\n){2}) Aber Dein Ausdruck würde, da \n und \r _vor_ \r\n vorkommt, dazu führen, dass \r\n\r\n als _vier_ Zeilenumbrüche erkannt würden.

            Viele Grüße,
            Christian

        4. Hallo Andreas,

          um Gottes Willen, ich bin doch kein Computerfachmann. So'n Bastlersystem kommt mir nicht auf den Schreibtisch ;)

          Du hast die aktuelle Usability-Studio zu GNU/Linux anscheinend noch nicht gelesen, denn Deine Vorstellungen hinken der Zeit mehrere Jahre hinterher.

          Nein, dies soll kein Überzeugungsversuch sein, wenn Du GNU/Linux nicht einsetzt, ist das Deine Sache; ich kann es einfach nur nicht mehr lesen, dass GNU/Linux als Bastlersystem bezeichnet wird, das war schon vor 2 Jahren genauso falsch.

          Viele Grüße,
          Christian