AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [php] BBCode Parser
Thema durchsuchen
Ansicht
Themen-Optionen

[php] BBCode Parser

Ein Thema von yankee · begonnen am 14. Jan 2007 · letzter Beitrag vom 6. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von yankee
yankee
Registriert seit: 10. Mär 2004
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.
Angehängte Dateien
Dateityp: zip bbcode_153.zip (2,2 KB, 86x aufgerufen)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
 
Benutzerbild von alcaeus
alcaeus
 
#2
  Alt 5. Mär 2007, 09:34
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
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#3
  Alt 5. Mär 2007, 14:24
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.
  Mit Zitat antworten Zitat
martinschroeder
 
#4
  Alt 11. Mär 2007, 20:40
Wozu in aller Welt ist $randid gut? Könnte man die nicht auch weglassen?
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze

 
Turbo Delphi für Win32
 
#5
  Alt 11. Mär 2007, 20:52
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!
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#6
  Alt 11. Mär 2007, 20:54
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 .
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.
 
#7
  Alt 11. Mär 2007, 21:00
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?
Christian S.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#8
  Alt 11. Mär 2007, 21:07
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.
 
#9
  Alt 11. Mär 2007, 21:11
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 von yankee:
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.
Christian S.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#10
  Alt 11. Mär 2007, 21:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 Uhr.
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