Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   [php] BBCode Parser (https://www.delphipraxis.net/84273-%5Bphp%5D-bbcode-parser.html)

yankee 14. Jan 2007 16:52


[php] BBCode Parser
 
Liste der Anhänge anzeigen (Anzahl: 1)
Auch in der DP wurde schon des häufigeren mal nach einem BBCode-Parser für php gefragt und das sehe ich mal als Begründung genug in der DP php zu veröffentlichen.

Im Anhang findet ihr einen bbcode parser, den ich heute mittag Geschrieben habe. Eine kurze (englische) Anleitung und ein kurzes Beispiel sind enthalten.

Das besondere an dem Parser im Vergleich zu anderen Parsern ist, dass er einen Zwischencode erstellt, der sowohl zu BBCode zurück gewandelt werden kann, als auch sehr schnell in html gewandelt werden kann.
Den Zwischencode in html umzuwandeln ist deutlich schneller als bbcode direkt zu wandeln. Daher eignen sich meine Funktionen gut, um den Zwischencode (in einer DB) zu speichern und dann sehr schnell anzeigen zu können und trotzdem noch wieder in bbcode editieren zu können.

Ihr könnt das ja mal testen...
Wäre nett, wenn ihr euch mal zu dem parser äusern würdet. Auch, ob ihr Sicherheitslücken uasmachen könnt.

EDIT:
1. kleiner Bug, den ich zuerst nicht gefunden habe, weil Opera das Ergebnis trotzdem richtig darstellte behoben.
2. automatisch URL-Erkennung hinzugefügt.
3. Den Beispielcode etwas erweitert.

EDIT2: Wenn ihr euch das doch schon runterladet, dann schreibt doch mal was dazu...
"jo, schön, funktioniert", "kann ich gut gebrauchen", "du spinnst doch, von solchen codeschnippseln gibt es schon Millionen", "Kann doch nichts... voll langsam", "Mein selbstgeschriebenes Forum braucht jetzt 99% weniger CPU ^^"
Die 6 Downloads bis jetzt speichern das doch wohl kaum auf ihrer Platte und gucken sich das dann nichtmal an ^^.

EDIT3:

Vorraussetzungen:
- PHP 5 (wäre aber auch eine Kleinigkeit den Code unter php4 zu betreiben: Einfach die static-Funktionen als function ohne Klassenkontext nehmen)

Sonst nix.

alcaeus 5. Mär 2007 09:34

Re: [php] BBCode Parser
 
Hmm, das Ding ist mir noch gar nicht aufgefallen. Ich gucks mir in den naechsten Tagen an und werde was dazu sagen ;)

Koenntest du in der Zwischenzeit was ueber die Voraussetzungen sagen? (PHP-Version, Safe-Mode, usw.)

Greetz
alcaeus

yankee 5. Mär 2007 14:24

Re: [php] BBCode Parser
 
Zitat:

Zitat von alcaeus
Koenntest du in der Zwischenzeit was ueber die Voraussetzungen sagen? (PHP-Version, Safe-Mode, usw.)

Du brauchst dafür php :-).
Also gut. So wie sie ist, braucht die Klasse php 5, aber jeder php-Programmierer brauch weniger als 60 Sekunden um den Code auf php4 umzuschreiben :-). Dafür muss man die 3 Funktionen nämlich nur aus dem Klassencontext rausnehmen und eben einfach so... ohne Klasse verwenden.

martinschroeder 11. Mär 2007 20:40

Re: [php] BBCode Parser
 
Wozu in aller Welt ist $randid gut? Könnte man die nicht auch weglassen?

Matze 11. Mär 2007 20:52

Re: [php] BBCode Parser
 
Zitat:

Zitat von martinschroeder
Wozu in aller Welt ist $randid gut? Könnte man die nicht auch weglassen?

Wie ich das letzte Woche gelernt habe, bekommen alle gültigen BBCodes diese zufällige ID. Stimmen Verschachtelungen nicht oder ist sonst etwas nicht korrekt, wird keine ID vergeben. Geparst werden dann nur die BBCodes, die eine ID erhalten haben, alle anderen werden im Klartext angezeigt.

Edit: Herzlich willkommen!

yankee 11. Mär 2007 20:54

Re: [php] BBCode Parser
 
Zitat:

Zitat von martinschroeder
Wozu in aller Welt ist $randid gut? Könnte man die nicht auch weglassen?

Neine, das würde zu Problemen einem Text wie diesem führen:
Code:
Hallo [b]bla
Wie du siehst wird der [b]-tag nie geschlossen. Dadurch, dass ich im str_replace beim generieren des html-codes nichtmehr nachgucken kann, ob jeder öffnende Tag auch einen schliessenden hat, kann man sich durch einen sich nicht schliessenden Tag die ganze Seite kaputt machen, nur weil irgendwer zu doof war, oder wirklich böswillig war.
Wenn also in einem Forum wirklich jemand versucht auf diese Weise die Seite kaputt zu machen (ok, mehr als das Design kann man damit nicht kaputt machen, aber das ist ärgerlich genug, besonders, wenn es auch noch ausversehen passieren kann), müsste er die randomid erraten (in meine Beispiel eine Trefferchance von 1:2^16.m )Wobei mich das auf die Idee bringt, dass man mit strpos auch noch prüfen könnte, ob die randid überhaupt im text ist und wenn nicht solange eine neue generieren, bis sie es nichtmehr ist. So könnte man die Möglichkeit das Design zu zerstören vollkommen ausschliessen).

Ich hoffe das war jetzt verständlich ;-). phpBB macht es übrigens genauso und nimmt eine randid, obwohl die, soweit ich es gesehen habe trotzdem noch an ein paar Stellen unnötigerweise reguläre Ausdrücke einsetzen ;-).

Wenn du dir sicher bist, dass deine benutzer keinen Scheiss bauen, kannst du die randid natürlich auch weglassen :-).

Christian S. 11. Mär 2007 21:00

Re: [php] BBCode Parser
 
Dass die RandId (oder BBCode-UID bei phpBB) verhindern soll, dass jemand falschem HTML-Code erzeugt, ist nicht richtig.

Du hast zwei Funktionen: FirstPass und SecondPass. FirstPass wird nur beim Speichern des Beitrags in der Datenbank aufgerufen, SecondPass bei jedem Anzeigen des Beitrags. Im FirstPass prüft man nun mittels Regex, welche Tags gültig sind. Diese Tags versieht man mit einer RandId und speichert den Beitrag mit dieser Änderung in die Datenbank. Im SecondPass macht man nun eine einfache String-Ersetzung der Tags mit RandId.

Dadurch hat man die aufwändige Ersetzung mit regulären Ausdrücken nur beim Posten des Beitrags, die schnelle String-Ersetzung wird verwendet, wenn der Beitrag angesehen wird. Die Verwendung von solchen IDs hat also lediglich Performance-Gründe.

//edit: @yankee: Wieso sollten die regulären Ausdrücke unnötig sein? Mit was bestimmst Du denn, in welche Tags die BBCode-UID reinkommt?

yankee 11. Mär 2007 21:07

Re: [php] BBCode Parser
 
Zitat:

Zitat von Christian S.
Dass die RandId (oder BBCode-UID bei phpBB) verhindern soll, dass jemand falschem HTML-Code erzeugt, ist nicht richtig.
[..]
Im FirstPass prüft man nun mittels Regex, welche Tags gültig sind. Diese Tags versieht man mit einer RandId und speichert den Beitrag mit dieser Änderung in die Datenbank. Im SecondPass macht man nun eine einfache String-Ersetzung der Tags mit RandId.

Ja... genau... Und den Aufwand macht man um zu verhindern, dass jemand falschen HTML-Code erzeugt. Oder wie siehst du das? Sonst könnte man ja nur secondPass nehmen und sich firstPass komplett sparen (mal abgesehen von Tags, die eine kleine Veränderung brauchen, damit sie ohne regx ge-stringreplaced werden können).

Zitat:

Zitat von Christian S.
//edit: @yankee: Wieso sollten die regulären Ausdrücke unnötig sein? Mit was bestimmst Du denn, in welche Tags die BBCode-UID reinkommt?

Im firstPass sind sie nicht unnötig, im secondPass aber schon. Und phpBB verwendet, wenn ich mich recht erinnere auch im secondPass regexe.

Christian S. 11. Mär 2007 21:11

Re: [php] BBCode Parser
 
Zitat:

Zitat von yankee
Ja... genau... Und den Aufwand macht man um zu verhindern, dass jemand falschen HTML-Code erzeugt. Oder wie siehst du das?

Richtig. Aber das kann ich auch die RandId. Dann muss ich es lediglich bei jedem Anzeigen machen. Weil das Performance kostet, nimmt man die RandId her. Um falschen HTML-Code "abzuwehren" brauche ich die nicht, sonder nur, damit selbiges nicht ständig neu gemacht wird.

Zitat:

Zitat von yankee
Zitat:

Zitat von Christian S.
//edit: @yankee: Wieso sollten die regulären Ausdrücke unnötig sein? Mit was bestimmst Du denn, in welche Tags die BBCode-UID reinkommt?

Im firstPass sind sie nicht unnötig, im secondPass aber schon.

Okay, ich dachte Du beziehst das auf alles. Ich glaube, bei URL-Tags. Da kann ich nur raten, weshalb das so ist. Eventuell damit bei einer Änderung der zulässigen Zeichen in einer URL (kam ja schon häufig vor) nicht alle Beiträge neu geparst werden müssen. :gruebel:

yankee 11. Mär 2007 21:14

Re: [php] BBCode Parser
 
Zitat:

Zitat von Christian S.
Richtig. Aber das kann ich auch die RandId. Dann muss ich es lediglich bei jedem Anzeigen machen. Weil das Performance kostet, nimmt man die RandId her. Um falschen HTML-Code "abzuwehren" brauche ich die nicht, sonder nur, damit selbiges nicht ständig neu gemacht wird.

Mein Post bezog sich eher darauf, was passieren würde, wenn man die Randid einfach weglassen würde, aber trotzdem nach dem Prinzip meines Parsers vorgeht. Also so, dass man als randid einfach immer einen leeren String nimmt. Und den Doppelpunkt in den preg_replaces noch entfernt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz