Hallo Daniel,
> $filecontent=preg_replace("/\{file:([[:alnum:]]+\.tpl)\}/", parse_file("\\1"), $filecontent);
Wie Dir Jörg bereits mitteilte, kannst Du der Dokumentation entnehmen, dass Du statt den doppelten Backslashes bei Ersatz die Dollar-Variante nehmen solltest:
<zitat>
Ersatz darf Referenzen in der Form \n oder (seit PHP 4.0.4) $n enthalten, wobei Letztere vorzuziehen ist.
</zitat>
Weiterhin hast Du ein kleines Problemchen mit Deinen Anführungszeichen, Jörg hatte dies übersehen:
<zitat>
mixed preg_replace ( mixed Suchmuster, mixed Ersatz, mixed Zeichenkette [, int Limit [, int &Anzahl]] )
</zitat>
Ersatz ist also vom Typ mixed, entweder eine Zeichenkette oder ein Array von Zeichenketten. Dir genügt eine Zeichenkette. Die einfache Variante ist diese:
$filecontent=preg_replace("/\{file:([[:alnum:]]+\.tpl)\}/", parse_file('$1'), $filecontent);
Die einfachen Anführungszeichen sind wichtig!
Die test.tpl:
Dies ist test.tpl, enthält den Verweis auf test2.tpl
{file:test2.tpl}Die test2.tpl:
<em>Dies ist test2.tpl</em>Führe ich das ganze aus, erhalte ich folgende Ausgabe:
function parse_file: übergebene Datei: test.tpl
function parse_file: übergebene Datei: \1
aborted - file \1
ja, ja, die doppelten Anführungszeichen schlagen zu. In doppelten Anführungszeichen ist der Backslash ein Escape-Zeichen. Es maskiert das folgende Zeichen, in Deinem Fall der Backslash, d.h. aus "\1" wird die Zeichenfolge
\1
Das ist keine Backreference :-) In doppelten Anführungszeichen und mit der veralteten Backreference mit doppelten Backslashes müsstest Du also
"\\1"
schreiben, um
\1
zu erhalten. Viel einfacher wäre jedoch die Variante
'\1'.
Am besten ist jedoch
'$1',
was viel besser ist als
"$1",
was auch funktionieren sollte, da dies ebenfalls
$1
zurückliefert im Gegensatz zu
"$1".
Gewöhne Dir an, nach Möglichkeit einfache Anführungszeichen zu verwenden. Diese sind sehr angenehm und dazu noch performant.
Freundliche Grüße
Vinzenz