Inhalt in Template ersetzten mit Preg_replace

nchristoph

Erfahrenes Mitglied
Hallo,

ich bin gerade am überarbeiten meiner Templateklasse, die ich in einem anderen Thema(leider durch den Serverausfall verlorengegangen) verbessert habe.

Ich will jetzt das Template öffnen, durchsuchen und alle Inhalte mit {varname} durch <?=$varname?> ersetzten.

Ich hab vorher noch nicht mit Regular Expressions gearbeitet aber ich hab mal was versucht.

SetSystemTemplate Funktion

PHP:
    public function SetSystemTemplate($value)
    {
        $pfad = 'templates/system/tpl/'.$value.'.tpl'; 
        if(file_exists($pfad))
        {
            $pfad = file_get_contents($pfad);
            $pfad = preg_replace('/{([^}]*)}/','',$pfad );
            return $pfad;
        }
        else
        {
            throw new Exception('<pre>Fehler beim Laden des Templates</pre>');
        }
        
    }

Leider hab ich nicht die leiseste Ahnung, wie der Ausdruck lauten muss, damit er aus {varname} <?=$varname;?> macht.

Momentan findet er schon {varname}.

Kann mir bitte wer helfen?
 
Hallo,

Sorry, dass dein Thread leider durch die Serverprobleme verloren gegangen ist.

So müsste es lauten:
PHP:
<?php

$pfad = preg_replace('/{([^}]*)}/', '<?=\$$1;?>', $pfad);
$1 steht hierbei für das erste gefundene Ergebnis, also dem Text, der vom ersten Klammernpaar im regulären Ausdruck gefunden wurde.
 
Danke für die schnelle Antwort ComFreek.

Jetzt wirds zwar richtig ersetzt, leider kriege ich jetzt diese Fehlermeldung.

PHP:
Warning: include(<form method="post" action="index2.php?admin=admin" > <fieldset class="form"> <legend>Konfiguration bearbeiten</legend> <!--<span class="error">Login Fehlerhaft</span><br />--> <label for="pagetitel">Page Titel</label> <input type="text" name="pagetitel" id="pagetitel" value="<?=$titel;?>" /><br /> <label for="subline">Subline</label> <input type="text" name="subline" id="subline" value="<?=$subline;?>" /><br /> <label for="submit">&nbsp;</label> <input class="button" type="submit" value="Speichern" id="submit" /><br /> <input type="hidden" name="a" value="update_config" /> </fieldset> </form>): failed to open stream in C:\xampp\htdocs\admin\inc\config.php on line 10

Zeile 10 in der config.php ist der SetSystemTemplate aufruf

PHP:
include $template->SetSystemTemplate('config');

Muss ich da noch was beachten beim umwandeln von {blabla} in $blabla?

Oder muss ich das komplett anders machen?

//Edit
Kann es sein, das der Mailserver noch nicht wieder 100% funktioniert? Kriege momentan keine ´Benachrichtigungen.
 
Zuletzt bearbeitet:
Include möchte einen Dateinamen, bekommt aber einen Dateiinhalt.

PHP:
$pfad = file_get_contents($pfad);

In $pfad steht ab der Stelle jetzt der Inhalt der Datei. Du möchtest aber den Pfad der Datei zurückgeben (der bis eben noch in $pfad drin stand).
Nach der Verwendung von preg_replace hast du dann den "richtigen" String der Datei in $pfad.
Wenn du dann
PHP:
include $template->SetSystemTemplate('config');
verwenden willst, müsstest du den neuen Inhalt entweder wieder in die Datei zurückschreiben (mit file_put_contents), was aber keinen Sinn macht an der Stelle, es sei denn die Änderung soll nicht dynamisch sondern dauerhaft gespeichert werden, dann ist aber irgendwie die ganze Funktion hinfällig weil die ja ständig aufgerufen würde, oder du weist den Inhalt einer Variable zu.
PHP:
$content = $template->SetSystemTemplate('config');
und gibst ihn danach aus oder wer weiß was. Bin mir nicht ganz sicher wozu das include an der Stelle benötigt wurde.

Also, ich bin mittelmäßig verwirrt. Vielleicht könntest du die grobe logik der Klasse noch erläutern.
 
Ich will mir mit der Funktion bzw. Klasse das setzen von Templates ganz einfach und unkompliziert machen.

Im anderen Thema, das leider verloren ging, hat mir timestamp beim finden eines Fehlers geholfen, weshalb das Template nicht geladen wurde.

Ich will die Klasse noch erweitern und zwar in dem ich den Content durchsuche und alles was in {} steht durch den entsprechenden variablennamen ersetzen lasse.

Mein Endziel ist, in der PHP Datei nur noch $template->SetSystemTemplate stehen zu haben.

Ich hab es jetzt geschafft, den Code ausführen zu lassen, aber mit eval, welches nach intensiver nachforschung eher unsicher und "Böse" ist.

Die ganze Klasse soll für mich Übungszweck und eine Art weiterbildung sein, da ich noch nicht wirklich was mit OOP gemacht habe.
 
Und warum hast du das jetzt von der Ersetzungsmethode (mit {}) in die echo-Methode umgewandelt?
Du musst bedenken, dass dadurch auch einige andere Änderungen am Skript bzw der Klasse notwendig sind.
 
Ich verwende nach wie vor die Ersetzungsmethode.

Hier mal meine komplette Klasse

PHP:
<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of template
 *
 * @author chrisi
 */
class template {
    
    
    public function __construct()
    {
    }
        
    public function SetStyle($value)
    {
        $sql = mysql_query("SELECT name,isdefault FROM templates WHERE isadmintemp = '1'");
        $row = mysql_fetch_assoc($sql);
        $adminthemename = $row['name'];
        $isdefault = $row['isdefault'];
    
        $pfad ='templates/'.$adminthemename.'/'.$value.'.php';    
        
        if(file_exists($pfad))
        {

            return $pfad;
        }
        else
        {
            throw new Exception('<pre>Fehler beim Laden des Styles</pre>');
        }
    }
    
   /* public function SetTemplate($value)
    {
        $sql = mysql_query("SELECT name,isdefault FROM templates WHERE isadmintemp = '1'");
        $row = mysql_fetch_assoc($sql);
        $adminthemename = $row['name'];
        $isdefault = $row['isdefault'];
    
        $pfad ='templates/'.$adminthemename.'/tpl/'.$value.'.tpl';    
        if(file_exists($pfad))
        {           
            return $pfad;
        }
        else
        {
            throw new Exception('<pre>Fehler beim Laden des Templates</pre>');
        }
    }*/
    
    public function SetSystemTemplate($value)
    {
        $pfad = 'templates/system/tpl/'.$value.'.tpl'; 
        if(file_exists($pfad))
        {   
            $pfad = file_get_contents($pfad, FILE_USE_INCLUDE_PATH);
            $pfad = preg_replace('/{([^}]*)}/', '<?=\$$1;?>', $pfad );

            return $pfad;
        }
        else
        {
            throw new Exception('<pre>Fehler beim Laden des Templates</pre>');
        }
        
    }
    
    public function __destruct(){
    }
}


?>

Welche änderungen an der Klasse sind für diese Methode noch notwendig?
 
Zuletzt bearbeitet:
Ich bin gerade am Erweitern des Template Parsers.

Ich möchte gerne Sprachvariablen einbauen und möchte es auch mit preg_replace versuchen:

PHP:
$pfad = preg_replace('/%([^}]*)%/', '<?=\$lang['$1']';?>', $pfad );

Leider krieg ich das Pattern nicht wirklich hin.

Muss ich, damit es funktioniert, es irgendwo Escapen?

Momentan kriege ich folgende Fehlermeldung:

Parse error: syntax error, unexpected '$' in C:\xampp\cms\core\classes\template.class.php on line 104

Line 104 ist der preg_replace aufruf.

Könnte mir bitte wer helfen?
 
Sry das ich den alten Thread wieder raufholen muss.

Ich hab meine Klasse jetzt umgeschrieben und hänge wieder beim Sprachvariablen Array,

Ich schaffe es einfach nicht, den richtigen ReplaceCode zu finden.

Mein momentaner Code schaut so aus:

PHP:
$this->template = preg_replace('/%([^}]*)\}/', $lang['\$1'], $this->template );

Wenn ich den Code allerdings verwende kommt diese Fehlermeldung:

PHP:
Notice: Undefined index: \$1

Lt. dem Post von Comfreek soll das $1 den ersten Wert beinhalten, der gefunden wurde.

Entweder Stimmt das Pattern nicht oder ich hab bei Regexp noch nicht wirklich den Durchblick.

In die Manual hab ich geschaut, aber bei allen Beispielen, die ich versucht habe nachzubauen, kommt eine Fehlermeldung oder das Template wird gar nicht erst geparst.

Grüsse

//EDIT:

Habs nun selber hinbekommen, und zwar ohne preg_replace.

Str_replace is um VIELES einfacher zu handhaben und funktioniert wunderbar.
 
Zuletzt bearbeitet:
Zurück