Mischa: "BB-Code" und Fragen zu preg_replace()

Hallo SelfForumler,

um auch den Leuten die Möglichkeit zu geben, eigene "Webseiten" zu erstellen, die sich nicht mit HTML auskennen, versuche ich gerade ein Script zu schreiben, welches bestimmte Ausdrücke eines Strings durch entsprechende HTML-Tags ersetzt. (Es soll also quasi ein "BB-Code" zur Formatierung verwendbar sein.)

Um das ganze so einfach wie möglich zu machen, möchte ich allerdings nicht - wie im BB-Code und natürlich sowieso in HTML üblich, den Tag-Namen nochmal im abschließenden Tag nennen wie z.B. hier:

[b]fetter Text[/b]

sondern möchte als abschließenden Tag nur eine eckige Klammer verwenden:

[b:fetter Text]

Analog möchte ich natürlich auch "BB-Code"-Elemente für kursiv, unterstrichen, für Links und für Grafiken erstellen, die durch entsprechenden HTML-Code ersetzt werden:

[i:kursiver Text]
[u:unterstrichener Text]
[url:http://www.link.de]
[bild:http://www.link.de/bild.jpg]

Soweit funktioniert noch alles ganz gut (auch verschachtelt), wenn ich die Funktion preg_replace() mit regulären Ausdrücken verwende und ein '?' am Ende der Suchparameter setze. Problematisch wird es jetzt allerdings, wenn ich Tabellen und Listen einfügen möchte, da ich hierbei ja "etwas im Ersetzten ersetzen" muss:

[tabelle:
{feld1.1}{feld1.2}{feld1.3}
{feld2.1}{feld2.2}{feld2.3}
.
.
.
{feldn.1}{feldn.2}{feldn.3}
]

bzw.:

[liste:
{punkt1}
{punkt2}
.
.
.
{punktn}
]

Während ich bei den anderen (o.g.) "BB-Codes" immer nach folgendem Code verfahren konnte:

// Ersetze Links

$search = "/([url:)([[:graph:]]*?)(])/";

$replace = '<a href="\2" target="_blank">\2</a>';

$testtext = preg_replace($search,$replace,$testtext);

muss ich nun offensichtlich anders an die Sache herangehen, denn es sollen ja beliebig viele Tabellenzellen bzw. beliebig viele Listenpunkte möglich sein!

Ich muss im Fall der Liste also zunächst das einleitende [liste: durch <ul>, sowie das abschließende ] durch </ul> ersetzen. Und nun muss ich INNERHALB dieser beiden Tags alle { durch ein <li> und alle } durch ein </li> ersetzen.

Und genau da liegt mein Problem: Wie kann ich PHP klarmachen, dass es diese geschweiften Klammern NUR INNERHALB der [liste: ]-Tags ersetzen soll?

Ich wäre dankbar für Eure Hilfe!

Viele Grüße,
Mischa

--
=========================
www.youth-page.de
www.mischa-hildebrand.de
  1. Warum sich damit rumärgern, wenn andere schon ausgefeilte Lösungen haben:

    http://www.christian-seiler.de/projekte/php/bbcode/
    (Google "bbcode php" ;-)

    Oder sogar eine völlig andere Lösung (leider nur für IE):

    http://www.interactivetools.com/products/htmlarea/

    1. Hallo,

      Warum sich damit rumärgern, wenn andere schon ausgefeilte Lösungen haben:

      Weil ich so ehrgeizig bin und die Lösung gerne selbst findet und verstehen möchte... ;-)

      Danke für Deine Antwort, aber die Anleitung bzw. Klasse unter

      http://www.christian-seiler.de/projekte/php/bbcode/

      ist wohl noch ein paar Stufen zu hoch für mich. Ich bin ein "von Zeit-zu-Zeit-Hobbybastler", kein PHP-Profi. Ich habe lange Zeit versucht, mich in diesen Quelltext hineinzuarbeiten, aber da sind einfach zu viele Elemente drin, von denen ich noch nie etwas gehört habe - leider.
      Kann man dieses "Ersetzen im Ersetzen" nicht auch wesentlich unkomplizierter und kürzer halten?! Müsste doch eigentlich irgendwie funktionieren...

      Grüße,
      Mischa

      --
      =========================
      www.youth-page.de
      www.mischa-hildebrand.de