Sarah: Zeilenumbrüche in <textarea> umwandeln

Beitrag lesen

Hello,

ich möchte Zeilenümbrüche aus einem Texteingabefeld mit PHP umwandeln. Das soll so aussehen:

Eingabe in <textarea>:

Absatz 1

Absatz 2

Absatz 3
usw.

Das Ergebnis soll dann so aussehen:

<p>Absatz 1</p>
<p>Absatz 2</p>
<p>Absatz 3</p>

Wie kann ich das am besten machen?

Die Browser _sollten_ alle, egal auf welchem System sie laufen, ein CRLF senden beim Zeilenumbruch, wenn die passende Umbruchmethode für die Textarea im HTML gefordert wurde. (wrap="soft")
http://de.selfhtml.org/html/formulare/eingabe.htm#bereiche

Manche Browser senden aber trotzdem nur CR oder LF.
Diesen Schaden müsstest Du auf dem Server erst einmal beheben. Es reicht, die LF (=chr(10)) aufzuheben. Der IE würde in einer Textarea die LF sowieso wieder zu CRLF ergänzen.

Also nimmst Du str_replace() http://www.php.net/manual/en/function.str-replace.php
und tauschst die Umbrüche aus.

Erst die CRLF gegen LF, dann die CR gegen LF und am Ende die LF gegen

"</p>".LF."<p class="meine_Klasse_Textbox">";

define (CR, chr(13));
define (LF, chr(10));

$textarea = str_replace(CR.LF, LF, $_POST['textarea']);
$textarea = str_replace(CR, LF, $textarea;
$textarea = str_replace(LF,   "</p>".LF."<p class="meine_Klasse_Textbox">", $textarea);
$textarea = "<p class="meine_Klasse_Textbox">".$textarea."</p>".LF;

In der letzten Zeile werden dann nur die äußeren Grenzen ergänzt.

Harzliche Grüße vom Berg
http://www.annerschbarrich.de

Tom

Hallo Tom,

besten Dank für Deine Antwort. Leider merke ich habe ich nicht ganz genau beschrieben, was ich brauche. Es muß unterschieden werden zwischen der Anzahl der Zeilenumbrüche.

Abs1

Abs2
kein Abs3

Abs3

Abs4

Abs5

So, "kein Abs3" soll nur ein <br /> nach "Abs 3" erzeugen. Der längere Abstand zwischen "Abs3" und "Abs4" (3 Zeilen) bzw. "Abs4" und "Abs5" soll durch <br /> und <p> erreicht werden. In CSS habe ich für <p> einen margin-bottom von 1em festgeschrieben.

Der Code insgesamt müßte dann so aussehen:

<p>Abs1</p>
<p>Abs2<br />
kein Abs3</p>
<br>
<p>Abs4</p>  (oder das <br> in <p>, egal)
<br>
<br>
<p>Abs5</p>

Geht das auch mit str_replace?

Ich hatte es bisher so um an die Absätze und einfachen Zeilenumbrüche zu kommen:

$absaetze = preg_split("/(\r\n){2,}/", $_POST['textarea']);
$breaks = explode("\r\n", $absaetze[$i]); (mit einer Schleife für jeden einzelnen Absatz).

Leider komme ich damit nur zu ein- und zweizeiligem Abstand. Wenn es mehr Zeilen sind, werden sie ja von der ersten Zeile eliminiert. Es wäre aber wichtig, daß mehrzeilige Umbrüche erhalten bleiben erhalten bleiben. Also wenn 3 ZeilenÜmbrüche, dann zwei raus und einen in ein <br> umwandeln und dem <p> hinzufügen.

Ich kriegs nicht hin ...

Liebe Grüße
Sarah