Sven: preg_replace - BBCode

Hallo,

programmiere gerade ein Forum und wollte gerne BBCode mit einbauen. Ein kleines problem habe ich bei der Funktion "Zitat / Quote". Und zwar wenn ein Zitat in einem anderen Zitat ist Z.b.

--------------------
[zitat=Gott]

[zitat=Mein name]
Text...
[/zitat]

Noch mehr Text...
[/zitat]
--------------------

SUCHMUSTER: /[zitat=(.*?)](.*?)[/zitat]/s

Dann zeigt er nur das Zitat von Gott an

"
[zitat=Gott]

[zitat=Mein name]
Text...
[/zitat]
"

Wie löse ich das problem?

MfG

  1. Moin!

    programmiere gerade ein Forum und wollte gerne BBCode mit einbauen. ...

    Wie löse ich das problem?

    Indem du keine regulären Ausdrücke zur Realisierung von BBCode benutzt, sondern dir einen richtigen Parser schreibst. Oder einen nimmst, den es schon gibt. http://www.christian-seiler.de/projekte/php/bbcode/ Die parst dir korrekt deinen BBCode und macht gültiges HTML draus.

    Reguläre Ausdrücke sind nicht in der Lage, die bei BBCode auftretenden Verschachtelungen korrekt auseinanderzuhalten. Das Problem ist komplexer, als nur einfach passende Pärchen von [X]...[/X] in <X>...</X> umzuwandeln.

    - Sven Rautenberg

    1. Hi!

      Reguläre Ausdrücke sind nicht in der Lage, die bei BBCode auftretenden Verschachtelungen korrekt auseinanderzuhalten. Das Problem ist komplexer, als nur einfach passende Pärchen von [X]...[/X] in <X>...</X> umzuwandeln.

      Passende Pärchen finden ist aber eine Aufgabe, die mit Regulären Ausdrücken erledigt werden kann: Recursive patterns.

      Ein Problem kann aber sein, dass die Anwender beim Schreiben der BBCode-Syntax nicht genau aufpassen und damit die Pärchen-Findung erschweren bis unmöglich machen. Zwei Lösungswege: Der eine ist, zu versuchen das Beste draus zu machen und trotz falscher Schachtlungen etwas mehr oder weniger Brauchbares zu erzeugen, so wie es Christians Klasse macht. Der andere wäre, Syntaxfehler zu erkennen - wenn Pärchen-Gegenstücke fehlen - und dem Eingebenden wieder vor die Füße zu werfen.

      Lo!

      1. Der andere wäre, Syntaxfehler zu erkennen - wenn Pärchen-Gegenstücke fehlen - und dem Eingebenden wieder vor die Füße zu werfen.

        Ja, eine Vorschau + der Anspruch des Benutzers an sein Werk, reicht meiner Meinung nach völlig aus.

    2. Indem du keine regulären Ausdrücke zur Realisierung von BBCode benutzt, sondern dir einen richtigen Parser schreibst.

      Vielleicht ist er dabei einen Parser zu schreiben, im Grunde kommt zwangsläufig einer raus, wenn man sowas umsetzt. Ob er in welchen Augen auch immer "richtig" ist, steht zwar auf einem anderen Blatt, aber daß hat relativ wenig mit der Benutzung oder unterlassen von regulären Ausdrücken zu tun.

  2. SUCHMUSTER: /[zitat=(.*?)](.*?)[/zitat]/s

    Dann zeigt er nur das Zitat von Gott an

    "
    [zitat=Gott]

    [zitat=Mein name]
    Text...
    [/zitat]
    "

    Wie löse ich das problem?

    Zwischen [zitat=(.*?)] und [/zitat] darf sinngemäß kein [zitat=(.*?)] vorkommen. Auf die Weise ersetzt Du von innen nach außen, in mehreren Durchgängen.

    (Außerdem willst Du vielleicht auch Zitate ohne Autor zulassen also ohne Gleichheitszeichen?!)

    1. Vielen Dank für eure Antworten. Es funktioniert jetzt!