Jeena Paradies: BBCode && Validität | Aufruf an freiwillige ITler zum Helfen

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

--
In der Schweiz auf Tour mit Jeena
http://jeenaparadies.de/weblog/2004/august/schweiz/
Kinder schlagen zu Erziehungszwecken ist in Deutschland verboten!
http://jeenaparadies.de/artikel/kinderschlagen/
Jeenas Bannertauschportal; selbstgemacht ;-)
http://jeenasbannerbude.de
  1. 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

    1. 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

      --
      In der Schweiz auf Tour mit Jeena
      http://jeenaparadies.de/weblog/2004/august/schweiz/
      Kinder schlagen zu Erziehungszwecken ist in Deutschland verboten!
      http://jeenaparadies.de/artikel/kinderschlagen/
      Jeenas Bannertauschportal; selbstgemacht ;-)
      http://jeenasbannerbude.de