Umwandlung von verschachteltem BBCode

CoverUnder

Mitglied
Hallo,

ich habe leider folgendes Problem mit einem meiner BBCodes:
An sich ist es kein Problem verschiedene BBCodes zu mischen. Zum Beispiel

Code:
[ url=Link-Adresse][ img]Bild-Adresse[ /img][ /url]

stellt kein Problem dar.
Sobald ich aber einen Beitrag zitieren möchte, der bereits ein Zitat enthält -> sprich ein verschachteltes Zitat habe, wird es nicht mehr richtig angezeigt.

Hier mein Code, der [zitat=Name des Zitierten]das Zitat[/zitat] in HTML umwandelt:

PHP:
$text = preg_replace("/\[zitat=(.*)\](.*)\[\/zitat\]/Usi", "<table><tr><td><table><tr><td><b>Zitat von \\1</b></td></tr><tr><td>\\2</div></td></tr></table></td></tr></table></div>", $text);

Wenn ich ein verschachteltes Zitat habe, wird das Äußere nicht mehr umgewandelt.
Sprich:

Code:
[zitat=CoverUnder][zitat=Name des Zitierten]Das Zitat[/zitat]

Ein Test.[/zitat]

Zweiter Test.

wird zu:

5vvmnm.jpg


Ich verstehe einfach nicht, weshalb es für die anderen Codes kein Problem ist, wenn sie verschachtelt werden, aber wieso es beim Zitieren nicht mag...

Grüße
 
Du bist wahrscheinlich zu ungeduldig. Das Problem hierbei wird sein, dass der Reguläre Ausdruck sich das erste [/zitat] sucht (was dann dummerweise das geschatelte ist). Bei den oberen geschachtelteten ist das kein Problem, da diese unterschiedliche Tags besitzen. Du musst deinen Code also "gierig" werden lassen, sprich: entferne den Modifikator "U" hinter dem Schrägstrich und es sollte klappen.
 
Zuletzt bearbeitet:
Leider wird der Code auch dann nicht richtig interpretiert...
Ich habe es nun sehr unsauber "gelöst", aber so "funktioniert" es zumindest vorübergehend, bis ich eine bessere Lösung finde. Der Code ist nun wieder "ungreedy" & ich hab ihn einfach kopiert und mehrmals hintereinander eingefügt. So oft, wie er eingefügt wurde, funktioniert auch das verschachtelte Zitieren... immerhin etwas, auch wenn es keine dauerhafte Lösung sein sollte...
 
ugngierig arbeiten und mit einer while-Schleife durchgehen.

PHP:
<?php 
$text = <<<ZITAT
[zitat=CoverUnder][zitat=Name des Zitierten]Das Zitat[/zitat]
 
Ein Test.[/zitat]
 
Zweiter Test.
ZITAT;

$pattern = '/\[zitat=([^\]]*)\](.*)\[\/zitat\]/is';
$replace = '<table><tr><tr><td><b>\1</b><br />\2</td></tr></table>'; 

while(preg_match($pattern, $text)){
    $text = preg_replace($pattern, $replace, $text);    
}
echo $text;

?>
 
Vielleicht funktioniert es auch so?

PHP:
<?php
$text = '[zitat=CoverUnder][zitat=Name des Zitierten]Das Zitat[/zitat]
 
Ein Test.[/zitat]
 
Zweiter Test.';

$a = 1;
$b = 0;
while($a)
{
	$text = preg_replace('/\[zitat=(.*?)\](.*)\[\/zitat\]/s', "<table><tr><td><table><tr><td><b>Zitat von \\1</b></td></tr><tr><td>\\2</td></tr></table></td></tr></table>", $text, -1, $a);
	if($a)
		$b++;
}


echo $text;

echo "Anzahl der Replacements: $b";

?>

Edit: Da war wohl jemand schneller ;-)

Edit2: Wobei meine Version dann etwas schneller wäre :-)
 
Zuletzt bearbeitet:
Jetzt bin ich verwirrt ^^ wo ist mein Beitrag hin? Na, egal.
Jedenfalls: Danke, die letzten beiden Lösungen sind spitze. Da bin ich nicht drauf gekommen... Vielen Dank!
 
Zurück