Manfred: Zu viele Zeilenumbrüche löschen

Hallo,

bei einem String sollen alle Zeilenumbrüche die mehr als zwei Leerzeilen enthalten auf zwei Leerzeilen gekürzt werden.
Weiß hier jemand, wie man das ausdrückt?

Grüße,
Manfred

  1. Hi!

    bei einem String sollen alle Zeilenumbrüche die mehr als zwei Leerzeilen enthalten auf zwei Leerzeilen gekürzt werden.
    Weiß hier jemand, wie man das ausdrückt?

    Man macht sich zunächst Gedanken, wie "Zeilenumbruch" genau definiert ist oder schaut dies im Zweifelsfall in einem Hex-Dump der betroffenen Daten nach. Dann schaut man im PHP-Handbuch unter Strings nach, wie Zeilenumbruchszeichen notiert werden und setzt sie passend in str_replace() ein.

    Lo!

    1. Hallo,

      danke, aber ich weiß ja nicht wie ich die bei str_replace einsetzen soll.

      1. Hi!

        danke, aber ich weiß ja nicht wie ich die bei str_replace einsetzen soll.

        Wer sind die? Was hast Du probiert?

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
        1. Hallo. Die Zeilenumbrüche. Hab alles mögliche probiert was ich so bei Google gefunden habe. Meistens preg_replace

          1. Hi!

            Hab alles mögliche probiert was ich so bei Google gefunden habe.

            Da hattest Du aber viel zu tun! Es ist sinnvoller das richtge zu probieren und nicht alles mögliche - "das richtige" wurde Dir doch bereits genannt.

            Meistens preg_replace

            Du benötigst keine Regulären Ausdrücke für eine einfache Ersetzung, deshalb schlug dedlfix vor, str_replace() zu nutzen - woran scheiterst Du bei der Verwendung dieser Funktion?

            off:PP

            --
            "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
            1. woran scheiterst Du bei der Verwendung dieser Funktion?

              Daran, dass ich nicht weiß was ich da einsetzen soll. Wie ich drei Umbrüche auf zwei kürze weiß ich. Aber nicht wie das geht wenn es immer maximal zwei Umbrüche geben soll.

              1. Daran, dass ich nicht weiß was ich da einsetzen soll. Wie ich drei Umbrüche auf zwei kürze weiß ich. Aber nicht wie das geht wenn es immer maximal zwei Umbrüche geben soll.

                Zuerst musst du wissen, was du ersetzen willst - ob das zwei oder mehr Umbrüche sind oder 2 oder mehrmals die Zeichenfolge "ungabunga" spielt keine Rolle.

                Je nach Dateiformat sieht ein Zeilenumbruch anders aus.

                Es ist dein erstes Ziel, das herrauszufinden - dafür reicht ggf. schon ein guter Texteditor.

                1. Ersetzt werden soll /r/n
                  1 /r/n = /r/n
                  2 /r/n = /r/n/r/n
                  3 /r/n = /r/n/r/n
                  1000 /r/n = /r/n/r/n

                  1. Hi!

                    Ersetzt werden soll /r/n
                    1 /r/n = /r/n
                    2 /r/n = /r/n/r/n
                    3 /r/n = /r/n/r/n
                    1000 /r/n = /r/n/r/n

                    Wunderbar, jetzt wissen wir wenigstens, dass es DOS-Zeilenumbrüche sind, auch wenn das \ und nicht / sein sollte. Und nun kann das als Code formuliert werden, und, wie suit einwarf, geht das besser mit preg_replace(), denn bei str_replace() müsste man solange schleifen, bis sich die Stringlänge nicht mehr ändert.

                    $text = preg_replace('#(\r\n){2,}#', "\r\n", $text);

                    Beim ersten Argument ist es egal, ob du es in " oder ' setzt. Bei " erkennt PHP das \r\n und ersetzt es durch die Zeilenumbruchszeichen, bei ' wird \r\n durchgereicht und die RegExp-Machine interpretiert sie als Zeilenumbruchszeichen.

                    Lo!

                    1. $text = preg_replace('#(\r\n){2,}#', "\r\n", $text);

                      Beim ersten Argument ist es egal, ob du es in " oder ' setzt. Bei " erkennt PHP das \r\n und ersetzt es durch die Zeilenumbruchszeichen, bei ' wird \r\n durchgereicht und die RegExp-Machine interpretiert sie als Zeilenumbruchszeichen.

                      Und zur Erklärung des Ausdrucks

                      sind die begrenzer, der eigentliche Ausdruck steht dazwischen.

                      (\r\n) ist ein Untermuster das gefunden wird, {} ist ein Quantifikator - wie auch + oder *.

                      {2} ist z.B. "vorhergehendes 2x", {2,6} wäre "mindestens 2x, maximal 6x", {2,} entspricht "mindestens 2x, maximal egal"

                      Die Quantifikatoren + und * entsprechen übrigens {1,} bzw. {0,}.

                      1. Klasse, danke dir auch.

                    2. Vielen Dank,
                      $text = preg_replace('#(\r\n){3,}#', "\r\n\r\n", $text);
                       macht genau das was ich haben wollte.
                      Hast mir sehr geholfen.

            2. Du benötigst keine Regulären Ausdrücke für eine einfache Ersetzung, deshalb schlug dedlfix vor, str_replace() zu nutzen - woran scheiterst Du bei der Verwendung dieser Funktion?

              Für's Protokoll: Mit einem regulären Ausdruck wäre es aber eleganter ;) "mehr als zwei Leerzeilen" schreit grade danach.

              1. Hi!

                Du benötigst keine Regulären Ausdrücke für eine einfache Ersetzung, deshalb schlug dedlfix vor, str_replace() zu nutzen - woran scheiterst Du bei der Verwendung dieser Funktion?

                Für's Protokoll: Mit einem regulären Ausdruck wäre es aber eleganter ;) "mehr als zwei Leerzeilen" schreit grade danach.

                Ich gebe zu Protokoll: suit hat recht und ich sollte besser lesen und weniger über  Texte fliegen!

                off:PP

                --
                "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)