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 2 von 2     12   
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
 
#11
  Alt 11. Mär 2007, 21:17
@Christian: Unter anderem das mit der Aenderung. Nehmen wir aber folgenden BBCode:
Code:
[url]www.foobar.net[/url]
Der muss ja ersetzt werden in
Code:
[url="http://www.foobar.net"]www.foobar.net[/url]
Jetzt erklaer mir wie du das ohne RegExp anstellen willst

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
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#12
  Alt 11. Mär 2007, 21:19
Zitat von alcaeus:
Jetzt erklaer mir wie du das ohne RegExp anstellen willst
Downloade meinen Parser und schau es dir an...
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.
 
#13
  Alt 11. Mär 2007, 21:21
Zitat von alcaeus:
Code:
[url="http://www.foobar.net"]www.foobar.net[/url]
Jetzt erklaer mir wie du das ohne RegExp anstellen willst
Habe ich behauptet, dass es geht? Aber ich könnte den RegExp deutlich einfacher gestalten und damit auch performanter, wenn eine UID in den URL-Tags steckte.

Zitat von alcaeus:
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
Das ist genau das, worum es gerade geht.

//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:
[url=http://www.foo.de]Bar[/url]
aus?
Christian S.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#14
  Alt 12. Mär 2007, 05:56
Zitat von Christian S.:
//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:
[url=http://www.foo.de]Bar[/url]
aus?
Hä? Was für'n roter Kasten?
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.
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.
 
#15
  Alt 12. Mär 2007, 08:58
Zitat von yankee:
Zitat von Christian S.:
//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:
[url=http://www.foo.de]Bar[/url]
aus?
Hä? Was für'n roter Kasten?
Der, der mir eigentlich sagen sollte, dass Du geantwortet hast, während ich meinen Beitrag verfasste.

Zitat von yankee:
Mein bbcode-Parser ist jedenfalls in der Lage dieses Konstrukt ohne regex im secondPass auszuwerten.
Japp, richtig.

Zitat von yankee:
EDIT: Das gewisse Regexe im secondPass Veränderungen am Code zulassen, lasse ich als Argument nicht zu.
Ich bin so frech und beuge mich nicht Deiner Entsscheidung.

Zitat von yankee:
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.
Kurz? Du darfst das gerne mal bei einer Datenbank von der Größe der DP oder EE machen, dann wirst Du sehen, dass dein "kurz" mal locker mehrere Stunden sind. Darauf kann ich gerne verzichten, nur damit zwei Zeichen weniger in der URL erlaubt sind.
Christian S.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus
 
#16
  Alt 12. Mär 2007, 09:29
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:
  • Ueberpruefung auf korrektes Parsing der Tags
  • Moeglichkeit bestimmte Tag-Verschachtelungen zu verbieten (z.B. sind in code alle Tags verboten, in b macht es keinen Sinn, nochmal b zu haben, usw. Praktisch dient es u.a. dazu, die Vermischung von Block-Level- und Inline-Tags zu verbieten

Greetz
alcaeus
Andreas B.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

 
Lazarus
 
#17
  Alt 12. Mär 2007, 13:15
Zitat von Christian S.:
Kurz? Du darfst das gerne mal bei einer Datenbank von der Größe der DP oder EE machen, dann wirst Du sehen, dass dein "kurz" mal locker mehrere Stunden sind. Darauf kann ich gerne verzichten, nur damit zwei Zeichen weniger in der URL erlaubt sind.
Ja... kurz...
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 .
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.
 
#18
  Alt 12. Mär 2007, 14:29
Zitat von yankee:
Ja... kurz...
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 .
Ich kann Dir als derjenige, der für die Foren-Software der Entwickler-Ecke zusätndig ist, versichern, dass diese Schätzung bei weitem nicht stimmt. Zum einen hast Du selten einen Server mit dieser Leistung. Außerdem musst Du auch noch die Datenbankzugriffe mit einbeziehen, die ebenfalls Zeit in Anspruch nehmen werden.

Zitat von yankee:
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...
Aha. Die ganzen Server, die mit phpBB arbeiten, müssten also mit 100% ausgelastet sein? Interessant.

Zitat von yankee:
Und wie oft kommt es bitte vor, dass du dein bbcode-parser verändert?
Wie oft haben die Leuts von phpBB an den gültigen Zeichen für URLs was geändert?

Zitat von yankee:
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 .
Wie gesagt, die Schätzung ist falsch. Und ich führe zumindest in der EE solche Aktionen nicht aus, während das Forum online ist.

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.
Christian S.
  Mit Zitat antworten Zitat
martinschroeder
 
#19
  Alt 12. Mär 2007, 17:50
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
(Sry, dass ich mich jetzt nicht mit euch über Serverlast streite )
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#20
  Alt 6. Mai 2007, 17:59
Bin selber noch auf der Suche nach sowas.

Und speziell sowas wär mir da wichtig:
Zitat von alcaeus:
* Moeglichkeit bestimmte Tag-Verschachtelungen zu verbieten (z.B. sind in code alle Tags verboten, in b macht es keinen Sinn, nochmal b zu haben, usw. Praktisch dient es u.a. dazu, die Vermischung von Block-Level- und Inline-Tags zu verbieten
Wenn dann noch ein Filter für HTML-Codes und eventuell noch was für Smilies gleich mit drin wären ... um so besser ^^
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 16:46 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