Vinzenz Mai: \\1 von preg_replace() an eigene Funktion übergeben

Beitrag lesen

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