Absätze einfügen

Hallo liebes Forum,

ich habe einen BB-Code-Editor entwickelt, der mit RegEx arbeitet.
Dieser funktioniert auch soweit ganz gut…

Nun möchte ich diesen um eine Funktion erweitern: Absätze bzw. p-Tags.

Der Folgende Text:

Hallo. Wie geht es dir?

Mir geht es gut.

[file]gut.jpg[/file]

soll in diesen umgewandelt werden:

<p>Hallo. Wie geht es dir?</p>
<p>Mir geht es gut.</p>
[file]gut.jpg[/file]

Es soll also um jeden Text-Baustein ein

-Tag gelegt werden. Bei einer neuen Zeile soll dann ein neues

-Tag eingefügt werden. Andere BB-Codes, wie in diesem Beispiel das [file]-Tag sollen aber nicht umgewandelt werden. Zusätzlich sollen alle überflüssigen Zeilenumbrüche im Text entfernt werden.

Da ich leider (keine) Ahnung von RegEx habe, bitte ich euch bei der Realisierung dieser Funktion um Hilfe.

Ich freue mich auch eure Antworten.

Hi,
wie liegt denn dein Text vor ? Als 3 einzelne Variablen, oder durch CR-LF getrennt ?
Ich sehe im Text auch kein BB-Code. Zeig mal PHP-Beispielcode, wie dein Text vorliegt.
Oder suchst du eine js-Lösung ?

Dann: 'ich habe einen BB-Code-Editor entwickelt, der mit RegEx arbeitet.'
und ‘Da ich leider (keine) Ahnung von RegEx habe’, was denn nun :unamused:

LG jspit

Der Text komm von einer Textarea und ist leider nicht in drei Variablen.

Wenn es denn in PHP realisiert werden soll, dann würde ich eine function schreiben die folgendes macht:

  1. Alle überflüssigen Zeilenumbrüche entfernen (preg_replace)
  2. Text in Zeilen splitten
  3. In einer Schleife über alle Zeilen oder eine entsprechende array-function abtesten ob ein
    BB-Code in der Zeile enthalten ist und wenn nicht

    und

    anfügen.
  4. Per join alles wieder zusammenkitten + Zeilenumbrüche zufügen wie gebraucht.

Hi,

Ausgabe:

[code]

Hallo. Wie geht es dir?

Mir geht es gut.

[file]gut.jpg[/file][/code]

Ein einfacher Zeilenumbruch würde ja eher durch exakt ein br-Element ersetzt werden.
Wenn man allerdings einen Abschnitt hat, vor und nachdem ein oder mehrere Leerzeilen
stehen, so würde man dies als Absatz interpretieren mit einem p-Element umschließen.
Man wird jetzt davon ausgehen, daß alles mit einem Absatz beginnt und einem Absatz endet,
von daher kann man vorne eine p-Anfangsmarkierung setzten und hinten eine p-Endmarkierung.
Findet man dazwischen eine oder mehrere aufeinanderfolgende Leerzeilen, so kann man diese
dann durch eine p-Endmarkierung gefolgt von einer p-Anfangsmarkierung ersetzen.
Weil einige Betriebssysteme mehr als ein Zeichen für einen Zeilenumbruch verwenden, muß
man sich um die überflüssigen Zeichen vorher kümmern, also etwa mittels preg_replace gegen
nichts tauschen.

Man kann indes auch nicht davon ausgehen, daß alle einfachen Zeilenumbrüche ohne
Leerzeile wirklich gewünscht sind und nicht nur durch die Eingabeart bewirkt sind.
Sofern man also nicht mit Gedichten oder dergleichen rechnet, kann es auch sinnvoll sein,
einfache Umbrüche zu ignorieren und nicht durch br zu ersetzen. Da die einfache
Klartexteingabe ja keine eindeutige Strukturierung zuläßt, kann man das auch nicht eindeutig
und automatisch in eine Struktur einer Auszeichnungssprache umsetzen.

Wenn irgendwas den BB-Code in Elemente konvertiert, muß man natürlich auch gucken,
daß dies sinnvoll passiert, innerhalb von p-Elementen dürfen etwa nur inzeilige Elemente
vorkommen. Fügt man irgendwo Ende und Anfang eines Absatzes ein, so darf natürlich diese
BB-Code-Ersetzung auch nicht davor und dahinter zusammenhängende Markierungen setzen.
Das müßte dann entsprechend wieder an der Absatzstelle aufgesplittert werden. Oder man
muß umgedreht den Absatz aufsplittern, wenn der BBC-Kram ein Blockelement erzeugen sollte.

Wenn im angegebenen Beispiel etwa [file] ein img-Element erzeugt, wäre es zudem noch
notwendig, wenn das nicht schon innerhalb eines Abstatzes steht, da einen Absatz
drum zu machen, weil man sonst ein inzeiliges Element auf der logischen Ebene von
den Blockelementen p hätte, was nicht sinnvoll ist.

Insgesamt ist die Aufgabe also nicht einfach sauber automatisch zu lösen. Statt einfaches
Suchen und Ersetzen braucht man da eigentlich schon einen parser, der die richtige Struktur
versucht zu erraten. Von daher wundert es nicht, daß die in Foren eingesetzten Skripte oft diese
oder jene Macke haben und die Ergebnisse oft dringend überarbeitungsbedürftig sind.