/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!
 

Sempervivum

Erfahrenes Mitglied
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
);
 

Sempervivum

Erfahrenes Mitglied
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.
 

Sempervivum

Erfahrenes Mitglied
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.
 

Sempervivum

Erfahrenes Mitglied
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
);
 

TheDoctor

Grünschnabel
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.
 

Sempervivum

Erfahrenes Mitglied
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
);
 

TheDoctor

Grünschnabel
Merci!

Nummer 1. Deine erneuten Modifikationen funktionieren einwandfrei.

Nummer 3. Funktioniert!

Nummer 2. Der Tipp mit dem e weglassen. Ich könnte schwören, das ausprobiert zu haben und es ging nicht. Jetzt geht es. :unsure:

Vielen lieben Dank!
 

Neue Beiträge