Frage

Ich möchte auf einem bbcode Filter für eine PHP-Website arbeiten. (Ich bin cakephp verwenden, wäre es ein bbcode Helfer) Ich habe einige Anforderung.

bbCodes verschachtelt werden können. So etwas wie die gültig ist.

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

bbCodes können haben 0 oder mehrere Parameter.

Exemple:

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

bbCodes könnte mutliple Verhaltensweisen haben.

Lassen Sie sagen, [url]text[/url] umgewandelt werden würde [url:url="text"]text[/url] oder das Video bbcode wäre in der Lage zwischen youtube zu wählen, dailymotion ....

Ich denke, es die meisten meiner Bedürfnisse zu decken. Ich alreay etwas mit Regex getan. Aber mein größtes Problem war, Parameter anzupassen. In der Tat habe ich bbcode mit 0 Parametern zu arbeiten und bbcode verschachtelt. Aber wenn ich eine Regex für Parameter hinzugefügt hat es nicht verschachtelten bbcode richtig passen.

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

Ich habe die komplette regex nicht gerade jetzt mit mir, aber ich hatte etwas, das so aussah (siehe oben).

So ist es eine Möglichkeit, bbcode effizient mit regex oder etwas anderes zu entsprechen. Das einzige, was ich denken kann, ist das Besuchermuster zu verwenden und meinen Text mit jedem möglichen Tags, um diese Art und Weise zu spalten, kann ich ein bisschen mehr Kontrolle über meine Textanalyse und ich könnte wahrscheinlich mein Dokument bestätige also, wenn der Eingabetext doesn ‚t gültig bbcode haben. Ich kann den Benutzer mit einem Fehler hinweisen, bevor etwas zu speichern.

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

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

Vielen Dank und sorry für mein schlechtes Englisch ...

War es hilfreich?

Lösung

Es gibt sowohl einen pecl und PEAR BBCode Parsing-Bibliothek. Software ist schwer genug, ohne jahrelange Arbeit auf eigene Faust neu zu erfinden.

Wenn keiner von denen eine Option ist, ich Drehen des BBCode in einen gültigen XML-String konzentrieren würde, und dann auf, dass Ihre Lieblings-XML-Parsing-Routine. Sehr sehr grobe Idee hier, aber

  1. Sie den Code durch htmlspecialchars Run, um alle Entitäten zu entkommen, die Flucht benötigen

  2. Transformieren alle Zeichen [und] in bzw.

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

Wenn die BBCode richtig verschachtelt wurde, sollten Sie alle eingestellt werden diese Zeichenfolge in ein XML-Parsing-Objekt zu übergeben (SimpleXML, DOMDocument, usw.)

Andere Tipps

es mehr vorhandenen Bibliotheken für BBCode Parsen, kann es einfacher sein, in denen zu sehen, als zu versuchen rollen Sie Ihre eigenen:

Hier ist ein Paar, ich bin sicher, dass es mehr gibt, wenn man sich umschaut:
PECL bbcode
PEAR HTML_BBCodeParser

gesucht in bbcode Parser mich. Die meisten von ihnen verwenden regex und PHP4 und produzieren Fehler auf PHP 5.2+ oder gar nicht arbeiten. PECL bbcode und PEAR HTML_BBCodeParser erscheinen nicht mehr aufrechterhalten werden (Ende 2012) und auf der Shared-Hosting-Setup nicht einfach installiert Ich habe mit zu arbeiten. StringParser_BBCode arbeitet mit einigen kleineren Verbesserungen für 5.2+ aber das Verfahren zur neue Etiketten hinzuzufügen, ist ungeschickt, und es wurde zuletzt im Jahr 2008 aktualisiert.

Buried auf der 4. Seite von einer Bing-Suche (ich war verzweifelt) Ich fand jBBCode , die neu erscheint und erfordert PHP 5.3. MIT Lisence. Ich habe noch den Aufbau von benutzerdefinierten Tags, um zu versuchen, aber bisher ist es das einzige, was ich versucht habe, die auf einem Shared-Hosting-Konto mit PHP 5.3 out of the box funktioniert.

  

Als Antwort auf: „Irgendwelche bessere Idee“ (Und ich gehe davon aus, dass dies eine Einladung nicht nur für die Verbesserung gegenüber bbcode spezifischen Vorschlägen)

Wir haben vor kurzem die bbcode Weg zu gehen und entschied über die Verwendung HTMLPurifier statt. Diese Entscheidung wurde teilweise auf die (zugegebenermaßen voreingenommen wahrscheinlich) Vergleiche zwischen den verschiedenen Methoden, die von der HTMLPurifier Gruppe aufgelistet hier und die Diskussion von bbcode (wieder durch die htmlpurifer Gruppe) hier

Und für die Aufnahme denke ich, Ihr Englisch war sehr gut. Ich bin sicher, es ist viel besser, als ich es in Ihrer Muttersprache tun könnte.

Verwenden preg_split() mit PREG_DELIM_CAPTURE Flag-Quellcode in Tags und nicht-Tags zu spalten. Dann iterieren Tags zu halten Stapel der offenen Blöcke (das heißt, wenn Sie Tag sehen zu öffnen, fügen Sie ihn in ein Array. Wenn Sie sehen Tag zu schließen, entfernen Elemente aus Ende des Feldes bis zur Schließung Tag Tag Spiele zu öffnen.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top