Mit der Funktion
preg_replace_callback habe ich es in wenigen Minuten gelöst:
PHP:
function parseList($matches)
{
if(preg_match("/\[#\]/",$matches[1]))
{
return "<ol>".str_replace("[#]","<li>",$matches[1])."</ol>";
}
else
{
return "<ul>".str_replace("[*]","<li>",$matches[1])."</ul>";
}
}
$result = preg_replace_callback("/\[list\](.*)\[\/list\]/siU", "parseList", $result);
Diese Lösung kann noch ins beliebige verbessert werden, z.B. Liste ganz rausnehmen, falls gar kein oder [#] reingeschrieben wurde oder sowohl als auch [#] in einer einzigen Liste behandeln usw. Die Grenzen sind unendlich, man braucht nur die Funktion "parseList" entsprechend erweitern.
Kurz eine Besprechung der Funktion preg_replace_callback: als zweiter Parameter steht die Funktion, an die die gefundenen Gruppen übergeben werden sollen. Diese Funktion, in unserem Falle "parseList", muss ein Argument übernehmen. Dies wird automatisch als Array gebildet, so wird, im ersten Array-Element ($matches[0]) der Gesamtausdruck abgelegt, im zweiten Element ($matches[1]) die erste Gruppe des regulären Ausdrucks usw. Die Funktion muss mit return einen String zurückgeben: er wird an die Stelle des Patterns gesetzt. Der Rest sollte sich von selbst erklären.
Wenn du das ganze in einer Klasse abhandelst, schreibst du:
PHP:
$result = preg_replace_callback("/\[list\](.*)\[\/list\]/siU", array(&$this,"parseList"), $result);
Das zweite Argument muss dann ein zweielem. Array sein, das zum einen eine Referenz auf die aktuelle Klasse (oder eine andere) übergibt, zum anderen wieder den Namen der Funktion.
Eine Alternative wäre noch die Verwendung der Funktion preg_replace mit dem Pattern-Modifier e (steht für evaluate). Dabei wird die Zeichenkette, die als Ersatz eingefügt wird, wie PHP-Code behandelt, und somit sind auch da Funktionsaufrufe möglich (beachte aber die korrekte Verwendung der Hochkommata!).