BBCode problem...

hohoho

Mitglied
hallo ! :)
ich arbeite gerade an nem news kommentar-system, wobei ich eigentlich bisher keine probleme hatte...
nun aber hab ich ein problem mit dem BBCode QUOTE...
hier erstmal mein script:
Code:
<?
$search = array();
$replace = array();

$search[] = "/(\n)/Uis";
$replace[] = "<br>";

$search[] = "/\[quote\](.+)\[\/quote\]/Uis";
$replace[] = "<p><span class=\"quote\"><blockquote>quote:<hr><b>\\1</b><hr></blockquote></span></p>";

$search[] = "/\[url\](.+)\[\/url\]/Uis";
$replace[] = "<a href=\"\\1\">\\1</a>";
$search[] = "/\[url\=(.+)\](.+)\[\/url\]/Uis";
$replace[] = "<a href=\"\\1\" target=\"_blank\">\\2</a>";

$search[] = "/\[B\](.+)\[\/B\]/Uis";
$replace[] = "<b>\\1</b>";
$search[] = "/\[I\](.+)\[\/I\]/Uis";
$replace[] = "<i>\\1</i>";
$search[] = "/\[U\](.+)\[\/U\]/Uis";
$replace[] = "<u>\\1</u>";

function bbcode($string) {
    global $search, $replace;
    return preg_replace($search, $replace, $string);
}
?>
es funzt ja bei einem zitat, aber wenn in dem zitat noch ein zweites ist, gibt es etwas codesalat ( :-) ).
so sollte es aussehen:

wäre für hilfe sehr dankbar ;)
 
zitat von http://www.weigl.de/seminar/php4/zeichen_regex.htm
Standardmäßig versuchen die Quantifier, auf einen so großen Text wie möglich zu passen. Dies kann zu Problemen führen: Angenommen es liegt eine Zeichenkette
Code:
$str = "[ b ]text[ /b ]text[ b ]text[ /b ]"
vor, und wir möchten daraus "<b>text</b>text<b>text</b>" machen. Versuchen wir es folgendermaßen:
Code:
$str = preg_replace("!\[ b \](.*)\[ /b \]!","<b>text</b>",$str);

so erhalten wir als Ergebnis
Code:
"<b>text[ /b ]text[ b ]text</b>"
- nicht ganz das, was wir wollten. Um dieses Verhalten abzustellen, setzen wir hinter den Quantifier ein Fragezeichen "?":
Code:
$str = preg_replace("!\[ b \](.*?)\[ /b \]!","<b>text</b>",$str);

und das gewünschte Ergebnis ist erreicht! Jeder der oben beschriebenen Quantifier kann durch ein angehängtes "?" zu diesem Verhalten bewegt werden, so z.B. {1,4}? oder +?.
 
Zuletzt bearbeitet:
Ich habe eben auch schon einiges gesucht, u.a. Google, PHP-ressource, aber eine Lösung habe ich letztendlcih immer noch nicht:

Bei mir werden verschachtelte [ quote ]-Blöcke, wie z.B.

[ quote]
test
[ quote]
tested
[/ quote]
huhu
[/ quote]

Auch falsch dargestellt, d.h.

[ quote]
test
[ quote]
tested
[/ quote]

huhu
[/ quote]

der rote Block wird ersetzt und das huhu [/ quote] bleibt so einfach stehen.

Beide aufgeführten Tags führen nicht zum Erfolg:
Code:
\[quote\]([^\[]*)\[\/quote\]
\[quote\](.*?)\[\/quote\]

Jemand eine Idee ?
 
Es gibt noch ne andre Möglichkeit, is aber mehr ne Notfalllösung:

PHP:
while(preg_match("/\[ B\](.+)\[\/B\]/Uis",$string) != $string)
{
$string = preg_replace("/\[ B\](.+)\[\/B\]/Uis",'<b>\1</b>',$string);
}
Kann aber sehr schnell zu endlosschleifen führen...(z.B. automatische Links)
 
Zuletzt bearbeitet:
Zurück