/e Modifikator

TheDoctor

Grünschnabel
Hallo liebes Schwarmwissen,

es ist zum Mäusemelken.

Dank PHP 7 funktioniert eine ältere TemplateEngine nicht mehr. Wo das Problem liegt, ist mir klar. Aber die Behebung will mir einfach nicht gelingen. Es geht um preg_replace vs. preg_replace_callback und den Modifikator /e, der in PHP 7 entfernt wurde. Vielleicht kann mir jemand bei den folgenden 3 Stellen helfen, nachdem ich den ganzen Tag experimentiert habe:

PHP:
$this->template = preg_replace( "/" .$this->leftDelimiterF ."include file=\"(.*)\.(.*)\"" .$this->rightDelimiterF."/isUe", "file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')", $this->template );
PHP:
$this->template = preg_replace( "/" .$this->leftDelimiterC ."(.*)" .$this->rightDelimiterC ."/isUe","", $this->template );
PHP:
$this->template = preg_replace("/\{L_(.*)\}/isUe", "\$lang[strtolower('\\1')]", $this->template);

Mein verzweifelter Dank, sei Euch gewiss!
 
Für die erste Zeile versuche dieses (ungetestet):
Code:
$this->template = preg_replace_callback(
    "/" . $this->leftDelimiterF . "include file=\"(.*)\.(.*)\"" . $this->rightDelimiterF . "/isU",
    function ($matches) {
        return file_get_contents($this->templateDir . $matches[0] . '.' . $matches[1]);
    }, $this->template
);
 
PS: Jetzt getestet hiermit und es waren in der Tat Fehler drin:
Code:
$template = '{{include file="cat.svg"}}';
$leftDelimiterF = '{{';
$rightDelimiterF = '}}';
$templateDir = 'images/';
$template = preg_replace_callback(
    "/" . $leftDelimiterF . "include file=\"(.*)\.(.*)\"" . $rightDelimiterF . "/isU",
    function ($matches) use ($templateDir) {
        global $templateDir;
        var_dump($matches);
        return file_get_contents($templateDir . $matches[1] . '.' . $matches[2]);
    }, $template
);
var_dump($template);
echo $template;
Demnach müsste es unter deinen Randbedingungen so funktionieren:
Code:
$templateDir = $this->templateDir;
$this->template = preg_replace_callback(
    "/" . $this->leftDelimiterF . "include file=\"(.*)\.(.*)\"" . $this->rightDelimiterF . "/isU",
    function ($matches) use ($templateDir) {
        return file_get_contents($this->templateDir . $matches[1] . '.' . $matches[2]);
    }, $this->template
);
Möglicher Weise geht die Verwendung von $this->templateDir; in der anonymen Funktion auch eleganter.
 
Freut mich zu lesen! Hast Du die anderen beiden Zeilen auch umstellen können? Wenn ich es richtig sehe, brauchst Du dafür gar keinen Callback.
 
BTW: Ich habe noch ein wenig nachgelesen und getestet und es scheint so zu sein, dass $this auch ohne use innerhalb der Funktion verfügbar ist, d. h. dieses sollte auch funktionieren:
Code:
$this->template = preg_replace_callback(
    "/" . $this->leftDelimiterF . "include file=\"(.*)\.(.*)\"" . $this->rightDelimiterF . "/isU",
    function ($matches) {
        return file_get_contents($this->templateDir . $matches[1] . '.' . $matches[2]);
    }, $this->template
);
 
Vielen Dank. Ich werde die Änderung mal testen.

Bei den anderen beiden bin ich leider noch nicht weiter.

Die Experimente verursachten zwar keine Fehler, aber leider auch nicht das gewünschte Ergebnis.
 
Und die dritte Zeile müsste wahrscheinlich so aussehen:
Code:
$this->template = preg_replace_callback("/\{L_(.*)\}/isU",
    function ($matches) use ($lang) {
        return $lang[strtolower($matches[1])];
    }, $this->template
);
 
Zurück