![]() |
[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. |
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 |
Re: [php] BBCode Parser
Zitat:
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. |
Re: [php] BBCode Parser
Wozu in aller Welt ist $randid gut? Könnte man die nicht auch weglassen?
|
Re: [php] BBCode Parser
Zitat:
Edit: Herzlich willkommen! |
Re: [php] BBCode Parser
Zitat:
Code:
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.
Hallo [b]bla
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 :-). |
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? |
Re: [php] BBCode Parser
Zitat:
Zitat:
|
Re: [php] BBCode Parser
Zitat:
Zitat:
|
Re: [php] BBCode Parser
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz