Der beste Weg, um bbcode zu analysieren

Lesezeit: 5 Minuten

Der beste Weg um bbcode zu analysieren
Loïc Faure-Lacroix

Ich möchte an einem BBCode-Filter für eine PHP-Website arbeiten. (Ich benutze Cakephp, es wäre ein BBCode-Helfer) Ich habe einige Anforderungen.

Bbcodes können verschachtelt werden. So etwas gilt also.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

Bbcodes können 0 oder mehr Parameter haben.

Beispiel:

[video: url="url", width="500", height="500"]Title[/video]

Bbcodes können mehrere Verhaltensweisen haben.

Nehmen wir mal an, [url]text[/url] umgewandelt werden würde [url:url="text"]text[/url]
oder der Video-BBCode könnte zwischen youtube, dailymotion … wählen.

Ich denke, es deckt die meisten meiner Bedürfnisse ab. Ich habe schon etwas mit Regex gemacht. Aber mein größtes Problem war, die Parameter anzupassen. Tatsächlich habe ich verschachtelten BBCode zum Arbeiten und BBCode mit 0 Parametern bekommen. Aber als ich eine Regex-Übereinstimmung für Parameter hinzufügte, stimmte sie nicht mit verschachteltem BBCode überein.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // Es war nicht .*, sondern der Non-Gready-Matcher

Ich habe gerade nicht die vollständige Regex bei mir, aber ich hatte etwas, das so aussah (oben).

Gibt es also eine Möglichkeit, bbcode effizient mit Regex oder etwas anderem abzugleichen? Das einzige, was mir einfällt, ist, das Besuchermuster zu verwenden und meinen Text auf diese Weise mit allen möglichen Tags aufzuteilen. Ich habe ein bisschen mehr Kontrolle über meine Textanalyse und könnte mein Dokument wahrscheinlich validieren, wenn der Eingabetext dies tut Ich habe keinen gültigen BBCode. Ich könnte den Benutzer mit einem Fehler benachrichtigen, bevor ich etwas speichere.

Ich würde sablecc verwenden, um meinen Textparser zu erstellen.
http://sablecc.org/

Irgendeine bessere Idee? oder alles, was zu einem effizienten flexiblen bbcode-Parser führen könnte?

Danke und Entschuldigung für mein schlechtes Deutsch…

Es gibt mehrere vorhandene Bibliotheken zum Parsen von BBCode, es kann einfacher sein, sich diese anzusehen, als zu versuchen, Ihre eigenen zu erstellen:

Hier sind ein paar, ich bin sicher, es gibt noch mehr, wenn Sie sich umschauen:
PECL-BBCode
PEAR HTML_BBCodeParser

  • jbbcode.com ist die beste Wette. Es kennt sich mit Tag-Stacking aus und verwendet keine regulären Ausdrücke. Ganz zu schweigen davon, wie einfach es ist, benutzerdefinierte Tags hinzuzufügen.

    – petrica.martinescu

    3. Januar 2015 um 12:18 Uhr

Ich habe mich selbst mit BBCode-Parsern befasst. Die meisten von ihnen verwenden Regex und PHP4 und produzieren Fehler auf PHP 5.2+ oder funktionieren überhaupt nicht. PECL bbcode und PEAR HTML_BBCodeParser scheinen nicht mehr gewartet zu werden (Ende 2012) und lassen sich nicht einfach auf dem Shared-Hosting-Setup installieren, mit dem ich arbeiten muss. StringParser_BBCode funktioniert mit einigen kleinen Änderungen für 5.2+, aber die Methode zum Hinzufügen neuer Tags ist ungeschickt und wurde zuletzt 2008 aktualisiert.

Vergraben auf der 4. Seite einer Bing-Suche (ich wurde verzweifelt), fand ich jBBCode, das neu erscheint und PHP 5.3 erfordert. MIT-Lizenz. Ich muss noch versuchen, benutzerdefinierte Tags zu erstellen, aber bisher ist es das einzige, das ich ausprobiert habe, das sofort auf einem Shared-Hosting-Konto mit PHP 5.3 funktioniert.

  • Dieser Beitrag ist ziemlich alt und ehrlich gesagt bin ich erstaunt, dass er immer noch aktuell ist. Wenn ich es nochmal umsetzen müsste. Ich würde es nicht mit Regexes machen. BBCode kann HTML sehr ähnlich sein, da es sich um eine Auszeichnungssprache handelt, die statt Klammern verwendet < und >. Ich würde wahrscheinlich einen XML-Parser anpassen, um nachzuprüfen [ and ] stattdessen. Auf diese Weise erhalten Sie ohne große Probleme alle Vorteile von xml in bbcode. Beim Analysieren des BBCodes können Sie fast alles tun.

    – Loïc Faure-Lacroix

    18. Oktober 2012 um 11:58 Uhr

Es gibt beides Stück und BIRNE BBCode-Parsing-Bibliothek. Software ist schwer genug, ohne selbst jahrelange Arbeit neu erfinden zu müssen.

Wenn beides keine Option ist, würde ich mich darauf konzentrieren, den BBCode in einen gültigen XML-String umzuwandeln und dann Ihre bevorzugte XML-Parsing-Routine dafür zu verwenden. Sehr sehr grobe Idee hier, aber

  1. Führen Sie den Code durch htmlspecialchars aus, um alle Entitäten zu maskieren, die maskiert werden müssen

  2. Verwandeln Sie alle [ and ] Zeichen in < bzw. >

  3. Vergessen Sie nicht, den Doppelpunkt in Fällen wie zu berücksichtigen [tagname:

If the BBCode was nested properly, you should be all set to pass this string into an XML parsing object (SimpleXML, DOMDocument, etc.)

  • That’s a horrible idea. What would [script] … [/script] tun?

    Benutzer47322

    22. Dezember 2009 um 6:47 Uhr

  • Ja, das ist ziemlich schrecklich, wenn Sie planen, HTML zurück auszugeben. Was ich geschrieben habe, war die Annahme, dass Sie den BBCode analysieren, um Informationen herauszuziehen. Wenn Sie etwas anderes als die offiziellen BBCode-Parser (die im ersten Absatz erwähnt wurden) verwenden, sind Sie zwangsläufig einem XSS-Angriff ausgesetzt.

    – Alan Sturm

    22. Dezember 2009 um 20:02 Uhr

  • @AlanStorm Das würde ich nicht sagen. Das Analysieren von BBCode als XML-ähnliches Markup ist eigentlich eine gute Idee und weniger anfällig für XSS-Angriffe, es sei denn, Sie analysieren den Inhalt nicht wirklich und ersetzen nur Tags durch HTML-Tags. Was hier eigentlich nicht der Punkt ist. Sie brauchen keinen XML-Parser, um ‘ zu ersetzen[‘ by ‘<‘. But extending bbcode through xml parsers makes lot of sense. It lets you define strict rules on what to do when finding an object and then you can output it back to html and anything that isn’t safe can be easily filtered withing your “pseudo DOM” objects.

    – Loïc Faure-Lacroix

    Oct 18, 2012 at 12:09

Responding to: “Any better idea?” (and I’m assuming that this was an invite not just for improvement over bbcode-specific suggestions)

We recently looked at going the bbcode route and decided on using htmlpurifier instead. This decision was based in part on the (admittedly biased probably) comparisons between various methods listed by the htmlpurifier group here and the discussion of bbcode (again, by the htmlpurifer group) here

And for the record I think your english was very good. I’m sure it’s much better than I could do in your native language.

Use preg_split() with PREG_DELIM_CAPTURE flag to split source code into tags and non-tags. Then iterate over tags keeping stack of open blocks (i.e. when you see opening tag, add it to an array. When you see closing tag, remove elements from end of the array until closing tag matches opening tag.)

914710cookie-checkDer beste Weg, um bbcode zu analysieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy