![]() |
[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:
|
Re: [php] BBCode Parser
@Christian: Unter anderem das mit der Aenderung. Nehmen wir aber folgenden BBCode:
Code:
Der muss ja ersetzt werden in
[url]www.foobar.net[/url]
Code:
Jetzt erklaer mir wie du das ohne RegExp anstellen willst ;)
[url="http://www.foobar.net"]www.foobar.net[/url]
BTW, nicht alle BBCodes werden durch FirstPass gejagt. Im phpBB bekommen URL-BBCodes keine UID verpasst, und muessen deshalb im Second-Pass validiert werden. Dies macht eine Anpassung des URL-BBCodes ohne Neuparsen der Beitraege moeglich :) Greetz alcaeus |
Re: [php] BBCode Parser
Zitat:
|
Re: [php] BBCode Parser
Zitat:
Zitat:
//edit: grmpf, roter Kasten? Hm, naja, das ist nicht schön, aber es geht in der Tat. Wie sähe das bei Tags der Form
Code:
aus?
[url=http://www.foo.de]Bar[/url]
|
Re: [php] BBCode Parser
Zitat:
Mein bbcode-Parser ist jedenfalls in der Lage dieses Konstrukt ohne regex im secondPass auszuwerten. EDIT: Das gewisse Regexe im secondPass Veränderungen am Code zulassen, lasse ich als Argument nicht zu. str_replace ist sehr viel schneller als preg_replace und im Zweifelsfall wäre es besser ein kleines update-script zu schreiben, welches kurz alle Beiträge neu parst. Schliesslich ist das eine einmalige Aktion, da ist es nicht so wichtig, wenn es etwas dauert. Beim Anzeigen der Beiträge, was bei grossen Foren mehrmals pro Sekunde passiert, kann es durchaus darauf ankommen. |
Re: [php] BBCode Parser
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: [php] BBCode Parser
Moin,
mal kurz unabhaengig von der Diskussion: ich hab mir im Laufe der letzten Woche deine Engine mal kurz durchgeguckt. Was mir dabei fehlen, sind folgende Dinge:
Greetz alcaeus |
Re: [php] BBCode Parser
Zitat:
Zum Zeitpunkt der Erstellung meines Beitrages gab es in der DB 611.718 Beiträge. Mein Parser braucht für den Beispiel text für firstPass gaaanz grob ca. 0,7ms und reverseFirstPass 2ms. (Athlon 64 3700+, 2 GB RAM) Sagen wir mal, dass der Durschnittliche Beitrag doppelt solang ist wie mein Beitrag, dann dauert first-Pass+reverseFirstPass ca. 5ms. 5msx611.718 also ca. 50 Minuten. Also weniger als 1 Stunde ;-). Und: Je grösser das Forum, je mehr Leistung verbrauchen diese Prozesse die ganze Zeit über.. Dann verbrauche ich zwar nur 5ms, aber wenn 200 Beiträge pro Sekunde abgerufen werden, ist der CPU zu 100% ausgelastet... Und wie oft kommt es bitte vor, dass du dein bbcode-parser verändert? Dann lässt du lieber das Update-script auf niedriger nice-Stufe im Hintergrund laufen, und produzierst so die gleiche Last, wie wenn du den Beitrag immer neu generieren würdest, aber nur für eine Stunde :-). Oder du speicherst die Version deines bbcode-Parser immer mit und beim anzeigen eines Beitrags merkst du, dass die Version outdated ist und regenierierst den Beitrag... Es gibt viele Möglichkeiten, aber sobald die DP bei 15 Beiträgen pro Seite (also 75ms Generationszeit) 40K Seitenaufrufe hatte hast du die Zeit für das Updatescript schon wieder raus :-). @alcaeus: Ich schau mal, ob ich nicht Zeit finde das einzubauen :-). |
Re: [php] BBCode Parser
Zitat:
Zitat:
Zitat:
Zitat:
Ich denke, wir werden da zu keinem "richtig" oder "falsch" kommen. Es ist alles eine Frage, wie man verschiedene Aspekte gegeneinander aufwiegt, und das tun auf Grund unterschiedlicher Erfahrungen halt anders. |
Re: [php] BBCode Parser
Na das sind ja mal reichhaltige Antworten.
In der Zwischenzeit hab auch ich mir mal den bbcode-parser von phpBB angeguckt und festgestellt, dass der genauso arbeitet wie dein Script. Sehr genial :-D (Sry, dass ich mich jetzt nicht mit euch über Serverlast streite ;-) ) |
Re: [php] BBCode Parser
Bin selber noch auf der Suche nach sowas.
Und speziell sowas wär mir da wichtig: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 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