Hier mal ein Beispiel, dass das Nesting der Zitate berücksichtigt...
Code: Alles auswählen
<?php
$txt = 'Hier kann was stehen
::: Zitatanfang
::: ...
::: Zitatende
Hier kann was stehen
:: Zitatanfang
::: eingebettetes Zitat
Hier steht schon wieder was dazwischen
:: Zitatende
Hier kann was stehen
: Zitatanfang
: ...
: Zitatende
Hier kann was stehen
:: noch ein Zitat am Ende
::: sogar eingebettet!
:: ende letztes Zitat';
$in = preg_split('/(\r\n|\r|\n)/', $txt, -1, PREG_SPLIT_DELIM_CAPTURE);
$out = '';
$qlevel = 0;
$open = 0;
$lbr = '';
while($in) {
if(preg_match('/^(:+)\s(.*)$/', $buf = array_shift($in), $r)) {
$thislvl = strlen($r[1]);
$buf = $r[2];
} else
$thislvl = 0;
$qr = '';
switch(TRUE) {
case $thislvl > $qlevel:
$open += $thislvl-$qlevel;
for($i=$qlevel; $i<$thislvl; $i++)
$qr .= '[quote'.$i.']';
$out .= $lbr.$qr.$buf;
break;
case $thislvl < $qlevel:
$open -= $qlevel-$thislvl;
for($i=$qlevel-1; $i>=$thislvl; $i--)
$qr .= '[/quote'.$i.']';
$out .= $qr.$lbr.$buf;
break;
default:
$out .= $lbr.$buf;
}
$qlevel = $thislvl;
if($in) $lbr = array_shift($in);
}
#offene quotes schließen:
for($i=$open; $i; $i--)
$out .= '[/quote'.$i.']';
#jetzt wird's lustig: überflüssige Zitateinrückungen entfernen
function remQuotes($txt, $lvl=0) {
if(!preg_match_all('/\[quote'.$lvl.'\](.*)\[\/quote'.$lvl.'\]/Us', $txt, $r))
return $txt;
foreach(array_keys($r[0]) as $k) {
$buf = trim(preg_replace('/\[quote'.($lvl+1).'\](.*)\[\/quote'.($lvl+1).'\]/Us', '', $r[1][$k]));
$repl = $buf ? $r[1][$k] : $r[0][$k];
$txt = str_replace($repl, remQuotes($r[1][$k], $lvl+1), $txt);
}
return preg_replace('/quote\d+\]/', 'quote]', $txt);
}
$out = remQuotes($out, 0);
?>
-----AUSGABE------
Hier kann was stehen
Zitatanfang
...
Zitatende
Hier kann was stehen
Zitatanfang
eingebettetes Zitat
Hier steht schon wieder was dazwischen
Zitatende
Hier kann was stehen
Zitatanfang
...
Zitatende
Hier kann was stehen
noch ein Zitat am Ende
sogar eingebettet!
ende letztes Zitat
-------
Naja, noch nicht ganz perfekt...