PHP Wann BBCode interpretieren?

Capt.Mollow

Cadet 2nd Year
Registriert
Juli 2004
Beiträge
18
Hallo zusammen,

ich habe da mal eine Frage:
Für eine Homepage habe ich ein kleines Newssystem programmiert. Im Admin-Bereich kann man den Text in einer Textarea eingeben, der anschlienßend mit htmlentities() in einer MySQL-DB gespeichert wird. Auf der Homepage wird der Text dann mit nl2br() geprintet.
Um die (rudimentäre) Formatierung des Textes zu ermöglichen, möchte ich jetzt BBCode integrieren. Daher stellt sich mir die Frage, wann er interpretiert werden soll und dazu sehe ich zwei Optionen:

Entweder wird der Text mit BBCode in der DB gespeichert und bei der Anzeige jedes News-Entrys läuft der Parser darüber.
--> könnte länger dauern und wird häufig durchgeführt?

Oder der Text wird zwei Mal in der DB gespeichert, einmal geparst ohne BBCode und einmal mit BBCode, weil man den Text auch später noch mal bearbeiten können sollte...
--> ca. doppelter Speicherplatzverbrauch?

Welche Lösung würdet ihr bevorzugen, bzw. gibt es da noch eine einfachere Lösung, z.B. formatierten HTML-Code in BBCode zurückzuführen?
Bisher habe ich das bei den php BBCode Libs nicht gesehen... Oder ist der generelle Ansatz schon nicht zu empfehlen?

Besten Dank :)
 
Also rein instinktiv würde ich den Text als mit der BBCode Formatierung in der DB speichern.

Um zu bearbeiten hast du doch sicherlich ne Seite geschrieben mit der du das machen kannst?
 
Die erste Variante wird in der Praxis immer durchgeführt. Der Parser-Aufwand ist nicht so enorm, und wenn du ein Caching-System hast, sollte das sowieso selten passieren.

Falls du dich für die andere Variante entscheidest, so wird der Speicherplatz mehr wie doppelt so groß (aber nicht viel mehr). Du brichst damit eher die Datenbankregel: Niemals zweimal die selbe Information abspeichern :)

Von HTML zu BB-Code ist grundsätzlich möglich, aber das finde ich nicht wirklich empfehlenswert.
 
Eagle-PsyX- schrieb:
Die erste Variante wird in der Praxis immer durchgeführt.
Cool, vielen Dank! So was ist gut zu wissen. Dann mache ich das auch mal so ;).

Reicht htmlentities() als Sicherung gegen ungewollte Codeausführung eigentlich aus?
 
Also wegen dem Cachen weiß ich jetzt noch nicht so genau wie man das löst, um die Ladezeiten zu verkürzen (hätte ich mal gucken sollen)... Aber auf einer Seite die ich baute, habe ich allen Kollegen gesagt das sie BBCode verwenden sollen. Und für die Ausgabe hab ich es dann ungefähr so gemacht (vereinfachte Variante!)

PHP:
<?php 
 function parseBBCode2HTML($bb) {
  $bb = preg_replace('/\[b\](.*?)\[\/b\]/', '<b>$1</b>', $bb);
  $bb = preg_replace('/\[i\](.*?)\[\/i\]/', '<i>$1</i>', $bb);
  $bb = preg_replace('/\[u\](.*?)\[\/u\]/', '<u>$1</u>', $bb);
  $bb = preg_replace('/\[li\](.*?)/', '<li>$1', $bb);
  $bb = preg_replace('/\[url=(.*?)\](.*?)\[\/url\]/', '<a href="$1" target="_blank">$2</a>', $bb);
  $bb = preg_replace('/\[img=(.*?)\ alt=(.*?)\]/','<img src="$1" alt="$2">', $bb);
  return $bb;
 }

 echo parseBBCode2HTML(nl2br($ausgabe));
?>
So ungefähr sieht meine Ausgabe aus. Und für die BBCode Geschichte hab ich halt eine Funktion gebaut. Wobei ich die halt ein wenig angepasst hatte für diverse Wünsche etc. ;)
 
Auf den und ähnliche Codes bin ich im Web auch schon gestoßen. Ich werde das auch so machen und noch ein paar Kleinigkeiten anpassen.

Vielen Dank euch allen! :) :daumen:
 
Eagle-PsyX- schrieb:
Die erste Variante wird in der Praxis immer durchgeführt.

Sag das nicht zu laut. Meiner Erfahrung nach ist es andersherum, und das mit gutem Grund - Speicherplatz ist billig und quasi beliebig erweiterbar, mit Rechenleistung verhält es sich nicht ganz so einfach.
 
@NullPointer
Du hast den Bezug zum Caching-System übersehen. Wer cacht spart dadruch *die* Rechenleistung.
Aber die Wortwahl war wirklich nicht sehr günstig: Eine gängige Praxis ist die erste Variante.

<-- Schnapszahl-Beiträge (999)
 
Zuletzt bearbeitet:
Also das mit dem Caching habe ich mal in einer kleinen Text-Seite ausprobiert. Sieht ja schon ganz nett aus. Ich müsste nur mal gucken, wie man den Quellcode für die Cache-Datei anpassen kann, wenn Chef sich das anguckt, bekommt der wohl noch einen Brechreiz...

Was mich auch mal interessieren würde, wie machen das denn CMS Systeme, erstellen die immer sofort eine neue cache Datei wenn man eine Seite überarbeitet hat, oder wie? Was mich dann noch interessieren würde für eine von meinen Seiten... MD5 hat ja 32 Zeichen, gibt es etwas mit 8 Zeichen was man gut verwenden kann?

Klar ich könnte jetzt immer eine Datei anhand der URL erstellen, aber ob mir das gefällt weiß ich noch nicht so genau :D
 
Ich meine das Magento das beim Überarbeiten neu abspeichert.
Da ich noch keine so enorm berechnungsaufwendige Seite erstellt habe, benutze ich ein Caching-System mit MD5-Indexierung. Dabei handelt es sich in den meisten Fällen um Auswertungen umfangreicher Dateien. Ist die Dateigröße (oder der file_hash()) verändert wird es neu berechnet, ansonsten bliebt der Cache-Eintrag gültig.
Smarty ist eine potente Template-Klasse die auch Caching unterstützt. Wollte mich mal damit genauer auseinandersetzen (also zur Eigennutzung und nicht beim Template-Schreiben :D ).
 
Du kannst eine BB-Code Umwandlung doch auch wieder rückgängig machen, um den Text anschließend im Editor zu bearbeiten:

PHP:
function rereplace($content) {
   $content = preg_replace("#<strong>(.+?)</strong>#is", "[b]\\1[/b]", $content) ;
   $content = preg_replace("#<u>(.+?)</u>#is", "[u]\\1[/u]",  $content) ;
   $content = preg_replace("#<em>(.+?)</em>#is", "[i]\\1[/i]", $content) ;

   return $content ;
}
 
Eagle-PsyX- schrieb:
Smarty ist eine potente Template-Klasse die auch Caching unterstützt. Wollte mich mal damit genauer auseinandersetzen (also zur Eigennutzung und nicht beim Template-Schreiben).
Ja, Smarty hatte man mir auch schon des öfteren empfohlen, weil ich gerne mal mit Templates bauen wollte, um den nutzen etwas genauer zu verstehen. Klar, durch lesen habe ich den Sinn von Templates schon verstanden, aber am besten klappt so etwas dann wenn man es in der eigenen Praxis erlebt :)

Darum hab ich mich auch mal kurz mit dem Cachen befasst, wie Du es geschrieben hattest... Denn das ist ja doch schon eine nette Variante. Und wenn man dadurch die Ladezeiten von den Seiten minimieren kann, ist das ja auch schon mal nicht schlecht :)

Auch wenn das hier nicht so in das Thema passt, aber wie ist das mit der MD5-Indexierung genau gemeint?
 
Nun Indexierung ist vielleicht das falsche Wort aber ich meine das so:
Ich speichere statistische Daten innerhalb einer Textdatei (so z.B. die Aktionen innerhalb einer BackEnd-Seite).
Aus den Daten innerhalb dieser Datei wird eine grafische Auswertung erstellt, die relativ viel Rechenleistung in Anspruch nimmt.
Da ich das Bild aber nicht bei jedem Laden der Seite ewig lange neu berechnen will, speichere ich die filehash()-Ausgabe der Textdatei (MD5-Wert) in eine Datenbanktabelle. So wird nur bei jedem Laden der Seite überprüft, ob sich die ursprüngliche Daten geändert haben - denn dann würde der MD5-Wert nicht mehr mit der in der Datenbank übereinstimmen. Ist das der Fall, wird das Bild gelöscht und ein neues erstellt. Falls nicht, wird einfach das alte Bild nochmal dargestellt.

Ein ähnlichen Fall habe ich jetzt mal mit hochgeladen.
Die Klasse ist übrigens OpenSource und heißt pChart. Es gibt zwar dort bereits ein Caching-System, aber aus irgendeinen Grund musste ich das damals abstellen und die obengenannte Methode einführen.
 

Anhänge

  • beispiel.png
    beispiel.png
    111,1 KB · Aufrufe: 213
Zuletzt bearbeitet:
Zurück
Oben