BBCode && Validität | Aufruf an freiwillige ITler zum Helfen
Jeena Paradies
- programmiertechnik
0 Stefan
Hallo,
Erst einmal möchte ich mein Versprechen halten und euch alle auf Ein neues Projekt von Scott Stadum aufmerksamm machen bei welchem er versucht Freiwillige Helfer im Bereich IT und potentielle Hilfesuchende in dritte Welt Ländern zusammenzuführen. Näheres erfahrt ihr auf dieser Seite: http://jeenaparadies.de/weblog/2004/august/freiwillige/
-----------------------
Und jetzt zu meinem Problem mit bbcode.
Ich benutze die bbcode Klasse von Christian Seiler http://www.christian-seiler.de/projekte/php/bbcode/ um folgendes zu erreichen:
[headline][/headline] => <h2></h2>
[list][*][/list] => <ul><li></li></ul>
[b][/b] => <em></em>
usw.
Jetzt wollte ich die Textabsätze die in der Textarea mittels \n\n (zwei mal Enter) gemacht werden in </p><p> umwandeln. Vor den ganzen Text noch ein <p> und danach ein </p> und es funktioniert mit reinem Text auch wunderbar.
Doch wenn ich jetzt ganz am Anfang eine <h2></h2> einsetze dann kommt logischerweise ein <p><h2></h2></p> raus was natürlich invalide ist. Die Klasse vereinheitlicht alle \n, \r und \r\n und ersetzt sie in <br />\n. Innerhalb des textes habe ich mir eine Funktion gebastelt die alles mögliche herausfiltert und ersetzt:
// Absätze erzeugen
function convertparagraphs ($text) {
$replace = array(
"<br />\n<hr /><br />\n",
"<br />\n<br />\n",
"<br />\n<ul>",
"</ul>\n</p>",
"<br />\n<h2>",
"</h2>",
"<p><h2>",
"</h2></p>",
"</h2>\n<br />\n",
"<br />\n<blockquote><p><br />\n",
"<br />\n</p></blockquote>\n<br />\n",
"<br />\n<blockquote><p>",
"</p></blockquote>\n<br />"
);
$to_this = array(
"</p>\n<hr />\n<p>",
"</p>\n<p>",
"</p>\n<ul>",
"</ul>",
"</p>\n<h2>",
"</h2>",
"<h2>",
"</h2>",
"</h2>\n<p>",
"</p>\n<blockquote><p>",
"</p></blockquote>\n<p>",
"</p>\n<blockquote><p>",
"</p></blockquote>\n<p>"
);
return "<p>".str_replace($replace, $to_this, $text)."</p>";
}
So weit funktioniert es auch aber leider nicht wenn ich am Anfang eine [headline] habe oder am ende eine Liste, oder allgemein gesagt wenn ich dort ein Blockelement habe, denn dann wird unnötigerweise ja immer noch ein <p> oder </p> eingefügt was nicht reingehört und die Seite invalide macht.
Hat sich damit vielleicht schon mal jemand von euch beschäftigt und hat da eine elegante Lösung gefunden? Ich habe hier nämlich ein schönes CMS gebastelt welches dem Kunden die Pflege der Seite mittels bbcode erleichtert. Es funktioniert natürlich alles wunderbar in den gängigen Browsern, aber es ist halt dieser Schönheitsfleck der mich ein wenig stört und ich denke dass das doch irgendwie zu lösen sein muss.
Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.
Grüße
Jeena Paradies
Hi Jeena,
vielleicht könntest Du Folgendes tun:
den Text anhand \n, \r, \r\n in ein Array splitten (via preg_split(), o.ä.)
über jedes Element des Arrays iterieren
- wenn es ein Blockelement ist (z.B. mit '<' beginnt), ignorieren
- wenn es nur Text ist, in <p>text</p> umwandeln
und am Ende das Array wieder zum Ergebnisstring verketten.
Gruß,
Stefan
Hallo,
Danke dir für den Ansatz, ich werde mir das durch den Kopf gehen lassen, obwohl ich noch nicht so richtig weiß wie ich das mit der Klasse kombiniere.
Grüße
Jeena Paradies