Bbcode parsen

hi,

Ich versuche, bbcode aus einem textarea-Feld zu parsen und komme irgendwie nicht so ganz weiter: Wenn ich mehrere bb-Codes verschachtele, werden nicht alle ausgefuehrt. Offensichtlich ist die Reihenfolge entscheident, wieviele bbcode’s geparst werden. Ich habe eine Funktion, in welcher mit str_replace() und eregi_replace jedesmal der String nach der Funktion geparst, uebersetzt und an die naechste Zeile uebergeben wird, in welcher weiter geparst wird. Offensichtlich ist das Problem bei den regulaeren Ausdruecken zu suchen. Ich liefere mal ein Beispiel mit und erhoffe mir ein paar Denkansaetze, um weiterzukommen:

$string = eregi_replace("\[url=([^\\[]*)\]([^\[]*)\[/url\]","\2",$string);

$string = eregi_replace("\url\\[/url\]","\1",$string);

Kann mir jemand sagen, was hieran falsch ist?

cu,
cjmatsel

kannst du ein beispiel mit verschachtelung (bzw mit problem) geben?
ich kann bei den gegebenen beispielen (noch) kein problem entdecken…

kannst du ein beispiel mit verschachtelung (bzw mit problem)
geben?
ich kann bei den gegebenen beispielen (noch) kein problem
entdecken…

[FONT=comic sans ms][COLOR=red][SIZE=3]grosse rote comic schrift[/SIZE][/COLOR][/FONT]

Wenn ich das so eingebe, wird nur die groesse geparst. In meiner Funktion steht folgendes:

$string = eregi_replace("\[COLOR=(^\[]*)\\[/COLOR\]","\2",$string);
$string = eregi_replace("\[FONT=(^\[]*)\\[/FONT\]","\2",$string);
$string = eregi_replace("\[SIZE=(^\[]*)\\[/SIZE\]","\2",$string);

Waere echt nett, wenn Du helfen koenntest.

cu,
cjmatsel

ok…du musst einfach deine regulären ausdrücke immer wiederholen, solange sich dein string duch diese ausdrücke geändert hat.
bleibt nach einem kompletten durchgang dein string gleich, kannst du sicher sein, dass kein bb-code mehr vorhanden ist.

das sieht bei deinem beispiel so aus:

 $string = "[FONT=comic sans ms][COLOR=red][SIZE=3]grosse rote comic schrift[/SIZE][/COLOR][/FONT]";

 while ($old\_string != $string)
 {
 $old\_string = $string;
 $string = eregi\_replace("\\[COLOR=([^\\[]\*)\\]([^\\[]\*)\\[/COLOR\\]","\\2",$string);
 $string = eregi\_replace("\\[FONT=([^\\[]\*)\\]([^\\[]\*)\\[/FONT\\]","\\2",$string);
 $string = eregi\_replace("\\[SIZE=([^\\[]\*)\\]([^\\[]\*)\\[/SIZE\\]","\\2",$string);
 }
 echo $string;

ok…du musst einfach deine regulären ausdrücke immer
wiederholen, solange sich dein string duch diese ausdrücke
geändert hat.
bleibt nach einem kompletten durchgang dein string gleich,
kannst du sicher sein, dass kein bb-code mehr vorhanden ist.

Ich habe eine Funktion geschrieben, welche aufgerufen wird. Ich dachte, ich benoetige dafuer keine Schleife, da in der Funktion alle Befehle nacheinander geparst werden…

cu,
cjmatsel

Ich habe eine Funktion geschrieben, welche aufgerufen wird.

wie sieht die aus?

Ich dachte, ich benoetige dafuer keine Schleife, da in der
Funktion alle Befehle nacheinander geparst werden…

solange du keine verschachtelten bb-codes verwendest, brauchst du auch keine schleife.
deine regulären ausdrücke verhindern das umwandeln eines bb-codes, sobald sich ein anderer bb-code darin befindet. dadurch, dass die bb-codes in beiden richtungen (und beliebig tief) verschachtelt werden können, kannst du nicht mit einem einfachen satz von regexps alles auf einmal umwandeln.