Marcus: Zeilenumbruch

Hallo.

Wie erzwinge ich mit PHP einen Zeilenumbruch nach x Zeichen?
Anwendung: Senden von E-Mails mit einer festen Textbreite

Dafür gibt es bestimmt eine einfache Funktion, doch meine selbstgestrickte möchte nicht so recht funktionieren....

Danke im voraus,

Marcus

  1. Hi,

    Wie erzwinge ich mit PHP einen Zeilenumbruch nach x Zeichen?

    zuerst alle \n entfernen:
    $text = ereg_replace("[\n\r]+"," ",$text);

    dann alle x Zeichen ein \n hinzufügen:

    $aktpos = 0;
    $x = 30;
    while($aktpos < strlen($text))
    {
    $text = substr($ext,$aktpos,$x) + "\n" + substr($text,$aktpos+$x);
    $aktpos += $x;
    }

    Dafür gibt es bestimmt eine einfache Funktion, doch meine selbstgestrickte möchte nicht so recht
    funktionieren....

    AFAIK nicht ;)

    mfg
    CK1

    <img src="http://wwwtech.de/images/banner.jpg" alt="">
    http://wwwtech.de/moorhuhn/

    1. zuerst alle \n entfernen:
      $text = ereg_replace("[\n\r]+"," ",$text);

      Nee, das darf nicht sein, denn bewusst gesetzte Absätze sollen natürlich erhalten bleiben. Daher klappt das nicht.

      Marcus

  2. Hallo Marcus,

    Dafür gibt es bestimmt eine einfache Funktion, doch meine
    selbstgestrickte möchte nicht so recht funktionieren....

    einfach nicht, aber ne Funktion:

    $text=preg_replace("/(.{0,76}) /","\1\n",$text);
                              ^^  max Zeilenlänge

    Gruss,
    Carsten

    1. $text=preg_replace("/(.{0,76}) /","\1\n",$text);
                                ^^  max Zeilenlänge

      Funktioniert nicht richtig: Es ist zwar keine Zeile länger als die angegebene max. Zeilenlänge, doch dafür habe ich nun zusätzliche Absätze, wo eigentlich gar keine vorgesehen waren.

      Ergebnis des übertragenen Textfeldes (Zeilenlänge = 60):

      Aber es geht ja nur darum, einen Zeilenumbruch zu
      erzweingen. So, jetzt kommt
      einer:
      Und, wo steht die Zeile
      jetzt?

      Im Text gab es nur einen Umbruch, nämlich vor dem "Und". Sowohl "einer" als auch "jetzt" hätte noch in die Zeile gepasst.

      Woran kann das liegen?

      1. Hi,

        $text=preg_replace("/(.{0,76}) /","\1\n",$text);

        Funktioniert nicht richtig: Es ist zwar keine Zeile länger als die angegebene max. Zeilenlänge, doch
        dafür habe ich nun zusätzliche Absätze, wo eigentlich gar keine vorgesehen waren.
        Woran kann das liegen?

        Ganz einfach: der RegExp registriert nicht, wenn ein von Hand gemachter Umbruch erfolgt ;)
        Vielleicht schafft das Abhilfe:

        $text = ereg_replace("(.[^\n]{0,10})[\r\n]{0,1}","\1\n",$text);

        Ich habs getestet und bin so schnell nicht auf Schwachstellen gestoßen; (.[^\n]{0,10}) sagt: 11 Zeichen,
        soll heißen, die 10 Steht für gewünschte Zeichen in einer Zeile - 1.

        mfg
        CK1

        <img src="http://wwwtech.de/images/banner.jpg" alt="">
        http://wwwtech.de/moorhuhn/

      2. Hi Marcus,

        ... als auch "jetzt" hätte noch in die Zeile gepasst.
        Woran kann das liegen?

        Das ist ein Fehler im regulären Ausdruck (da habe ich wohl schlampig getestet.)
        Der Ausdruch ist ja sozusagen 'andersrum' formuliert als die Aufgabebstellung:
        "Ersetzte jedes Leerzeichen nach höchstens 60 Zeichen durch einen Zeilenvorschub."

        Dadurch bekommt die letzte Zeile immer einen Zeilenvorschub, auch wenn sie
        gar keine 60 Zeichen hat (hier kein Problem). Aber wenn die Zeile nicht mit
        einem Leerzeichen endet, dann wird der Zeilenumbruch _vor_ das letzte Wort
        gesetzt. Billige Abhilfe: Einfach immer ein Leerzeichen anhängen:
          $text=nl2br(preg_replace("/(.{0,59}) /",">\1<\n",$text." "));

        Für Zeilenumbrüche im Eingabestring war der Ausdruck so schlichtweg nicht
        vorgesehen. Der Ausdruck müsste dafür auch noch die \n matchen:

        $text=nl2br(preg_replace("/(.{0,59})[ \n]/",">\1<\n",$text."\n"));

        ...und Zeichenketten länger als 60 Zeichen ohne Leerzeichen werden davon immer
        noch nicht gesplittet.

        Gruss,
        Carsten

  3. Hi Marcus,

    ich habe mal nen altes Programm von mir rausgekramt, und dort fiolgendes gefunden.

    //folgende Fkt. bricht den Text nach 72 zeichen immer vor dem letzten Wort um
    function formattext ($text) {
      //alle woerter kommen einzeln in ein array
      $woerter = explode(" ",$text);
      $i=0;
      $z=0;
      while($i<count($woerter)) {
        //solange eine worthinzufuegung nicht > 72 ergibt   UND  noch woerter da sind  ODER das wort > 72 zeichen ist
        while(((strlen($zeile[$z])+strlen($woerter[$i]))<=71) && $i<count($woerter) strlen($woerter[$i])>71) {

    $woerter2 = explode(Chr(13).Chr(10),$woerter[$i]);

    //wenn $woerter  aus mehreren Vars  besteht, dann zerlege diesen Array in Variablen
          if(count($woerter2)>1) {
            //mache mnach jedem wort wieder eine leerzeile
            for($a=0;$a<count($woerter2);$a++) {
               $zeile[$z].=$woerter2[$a]." " ;
               $text2.=$zeile[$z]."\n";
               $z++;
            }
            $i++;
            // damit danach kein absatz ist, loesche den letzten zeilenumruch wieder
            $text2 = chop($text2);
            $text2.= " ";
          }
          //wenn das wort>72 zeichen lang ist, dann fange eine neue zeile an, es sei denn
          //es ist das 1. Wort
          if(strlen($woerter[$i])>71 && $i>"0") $z++;
          if(count($woerter2) == 1) {
          $zeile[$z].=$woerter[$i]." " ;
          $i++;
          }
        }
    //    echo "---$z=".$z."---$i=".$i."----".$text2."<br><br>";
        $text2.=$zeile[$z]."\n";
        $z++;
      }
    //  $text2=str_replace("\n","\n",$text2);
      return $text2;
    }

    Duerfte eigentlich genau das sein was du willst. Viel spass ;-) Kann sein das man da so einiges noch besser loesen koennte. doch dazu habe ich jetzt keine lust ;-)

    MfG Olli