hmm - ich bastel grad an einem Template System für mein CMS. Doch jetzt bin ich irgendwie auch ein komisches Problem gekommen.
preg_replace kennt ja bekanntlichermaßen den Modifier /e mit dem der replacement string als PHP interpretiert wird. Das funktioniert auch wunderbar solange ich globale Funktionen aufrufen möchte. Will ich eine Kindprozedur einer Klasse aufrufen oder eine Prozedur der eigenen Klasse ($this) funktioniert das ganze nicht mehr.
Hier ein Beispiel:
$code = preg_replace("#(^|\s)(\\$)([^\\$\s]*?)(\\$)(^|\s)#ise", "'\\1' . parse_vars('\\3') . '\\5'", $code);
diese Variante funktionert wunderbar und liefert korrekte Ergebnisse.
Wähle ich ich diese Variante:
$code = preg_replace("#(^|\s)(\\$)([^\\$\s]*?)(\\$)(^|\s)#ise", "'\\1' . $this->parse_vars('\\3') . '\\5'", $code);
oder diese:
$code = preg_replace("#(^|\s)(\\$)([^\\$\s]*?)(\\$)(^|\s)#ise", "'\\1' . $template->parse_vars('\\3') . '\\5'", $code);
wird keine Funktion aufgerufen sondern nur das Äquivalent zu \1\3\5 zurückgegeben.
php.net hat mir leider keine passende Antwort gebracht. Ich nutze PHP 4. Vielleicht weiß ja einer (Pierre? 😉 ) Rat...