Aktuelle Zeit: 22. Mai 2013, 19:00

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
 Absätze einfügen 
Autor Nachricht

Registriert:
15. Feb 2011, 18:39
Beiträge: 14
Beitrag 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:
Code:
Hallo. Wie geht es dir?

Mir geht es gut.

[file]gut.jpg[/file]


soll in diesen umgewandelt werden:
Code:
<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 <p>-Tag gelegt werden. Bei einer neuen Zeile soll dann ein neues <p>-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.


23. Apr 2012, 17:48
Profil
Benutzeravatar

Registriert:
4. Apr 2008, 08:07
Beiträge: 141
Wohnort: Berlin
Beitrag Re: Absätze einfügen
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 :roll:

LG jspit


24. Apr 2012, 06:15
Profil

Registriert:
15. Feb 2011, 18:39
Beiträge: 14
Beitrag Re: Absätze einfügen
Der Text komm von einer Textarea und ist leider nicht in drei Variablen.


24. Apr 2012, 08:09
Profil
Benutzeravatar

Registriert:
4. Apr 2008, 08:07
Beiträge: 141
Wohnort: Berlin
Beitrag Re: Absätze einfügen
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 <p> und </p> anfügen.
4. Per join alles wieder zusammenkitten + Zeilenumbrüche zufügen wie gebraucht.


24. Apr 2012, 11:22
Profil

Registriert:
25. Mär 2008, 01:48
Beiträge: 552
Wohnort: koblenz
Beitrag Re: Absätze einfügen
Hi,
Code:
function nl2p($str, $separator = "\n") {

    $str    = str_replace("\r\n", "\n", $str);
    $output = array_map(function($line) {
        $pattern =  '/^\[(.*)\](.*)\[\/(.*)\]$/';
        $line = trim($line);
        if(preg_match($pattern, $line)) {
            return $line;
        }
        return '<p>'.$line.'</p>';
    }, array_filter(explode("\n", $str))); 
    
    return join
($separator, $output);
}
 
Code:

$str 
= "Hallo. Wie geht es dir?

Mir geht es gut.

[file]gut.jpg[/file]"
;

echo nl2p($str);
 

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


24. Apr 2012, 13:09
Profil
Benutzeravatar

Registriert:
19. Feb 2008, 19:06
Beiträge: 1939
Wohnort: Hannover
Beitrag Re: Absätze einfügen
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.

_________________
Hilfen zu SVG, XHTML, CSS, PHP (de) | SVG-Animationstest (de, en) |
LML (en) | DasSpiel | Öffentliche Kunst in Hannover


24. Apr 2012, 13:28
Profil
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: White-Tiger und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst Deine Beiträge in diesem Forum nicht ändern.
Du darfst Deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB © phpBB Group., phpBB.de