[PHP] BBCode zu HTML-Tags: nicht geschlossene Tags entfernen

mh1001

Lt. Commander
Registriert
Nov. 2003
Beiträge
2.039
Hallo zusammen,

ich stehe mal wieder vor einem hoffentlich einfach zu lösenden Problem. ;)
Zum Thema: In dem Gästebuch auf meiner Website kommen ein paar BBCode-Tags zum einsatz ([ B ], [ U ] und [ I ]).
Diese werden vor dem Abspeichern in der Datenbank mit folgender Funktion in gültige HTML-Tags umgewandelt:

PHP:
function textformatierung($text)
{
$format = htmlentities($text);
$format = nl2br($format);
$format = str_replace("[ b ]", "<b>", $format);
$format = str_replace("[ /b ]", "</b>", $format);
$format = str_replace("[ i ]", "<i>", $format);
$format = str_replace("[ /i ]", "</i>", $format);
$format = str_replace("[ u ]", "<u>", $format);
$format = str_replace("[ /u ]", "</u>", $format);
$format = trim($format);
return $format;
}
Nun zu meinem Problem: Wie schaffe ich es, dass nicht geschlossene Tags beim Eintragen nicht umgewandelt werden? Ich habe schon einige Versuche unternommen dieses Problem zu lösen, doch bin ich zu keinem vernünftigem Ergebnis gekommen. Ich hoffe jemand von euch hat eine Lösung parat. ;)

Vielen Dank schon einmal im Vorraus!

MfG mh1001

/Edit: Die BBCode-Tags sind natürlich ohne Leerzeichen. Diese mussten nur hinzugefügt werden, da diese sonst hier im Forum auch als solche interpretiert wurden. ;)
 
Zuletzt bearbeitet: (BBCode-Tags unschädlich gemacht ;))
du brauchst im grunde nur alle offenen zaehlen (substr_count()) und dann nur so viele ersetzen, wie wirklich vorhannden. zudem kannst du dir mal str_tr() naeher ansehen - damit ersparst du dir schreibarbeit.
 
Stimmt, substr_count() wäre schon einmal ein guter Ansatz. :daumen:

Doch wäre es mir lieber wenn nebenbei auch noch zum Beispiel aus diesem Text:
Code:
[ b ]Dies ist ein [ b ] kleiner Beispieltext [ /b ]
dieser String generiert würde:
Code:
[ b ]Dies ist ein <b> kleiner Beispieltext </b>
Das heißt, dass dabei auch die Position der Tags berücksichtigt sein sollte und nicht zum Beispiel einfach die letzten "überschüssigen" Tags nicht bearbeitet werden sollten.

Bezüglich der Funktion str_tr() hatte ich mir auch schon Gedanken gemacht. Doch verliert dabei das ganze etwas an Übersicht und da der Berechnungsaufwand auch nicht höher sein sollte habe ich mich für die Variante mit str_replace() entschieden.

Auf jeden Fall aber einen herzlichen Dank für deine Tipps, vielleicht findet noch einer eine andere einfache Lösung die auch das oben genannte berücksichtigt. ;)

MfG mh1001

 
Zuletzt bearbeitet:
fuer soetwas brauchst du dann regular expressions (regexp). kannst du dir unter http://regenechsen.de naeher ansehen.

und wo verlierst du bitte die uebersicht? du den bbcode perfekt aufgereiht, ohne ueberschussigen code, ohne die tipparbeit. ich finde

PHP:
$bbcode = array(
'[b]' => '<b>',
'[i]' => '<i>',
'[u]' => '<u>');
$string = strtr($string, $bbcode)

wesentlich uebersichtlicher und strukturierter als

PHP:
$format = str_replace("[ b ]", "<b>", $format);
$format = str_replace("[ /b ]", "</b>", $format);
$format = str_replace("[ i ]", "<i>", $format);
 
Nocheinmal einen herzlichen Dank für deinen Tipp. Dies werde ich mir auf jeden Fall einmal näher anschauen.

Bezüglich strtr() kam ich gar nicht auf die Idee die Array-Elemente so aufzulisten. *schäm*
So kommt dies natürlich auch in keinster Weise der Übersichtlichkeit in die Quere. :daumen:

MfG mh1001

/Edit: Ich habe mir jetzt einmal die Seite näher angeschaut und nach etwas blättern im PHP-Manual und einigen Suchen im Internet ist es mir gelungen eine entsprechende Funktion auf die Beine zu stellen. ;) Mit strtr() wurde es aber wieder nichts. ;)

Hier noch der Code falls jemand noch auf diesen Thread stößt und diesen gebrauchen kann ;) :

function textformatierung($text)
PHP:
function textformatierung($text)
{
$format = htmlentities($text);
$format = nl2br($format);
$format = preg_replace("#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $format);
$format = preg_replace("#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $format);
$format = preg_replace("#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $format);
$format = preg_replace("#\[url\]www\.(.+?)\[/url\]#is", "<a href=\"http://www.\\1\" target=\"_blank\">www.\\1</a>", $format);
$format = preg_replace("#\[url\](.+?)\[/url\]#is", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $format);
$format = preg_replace("#\[url=(.+?)\](.+?)\[/url\]#is", "<a href=\"\\1\" target=\"_blank\">\\2</a>", $format);
$format = trim($format);
return $format;
}
 
Zuletzt bearbeitet:
Zurück
Oben