Gabriel: Variablen in Single-Quoted String

Hallo,

ich brauche für ein kleines Projekt so etwas wie einen Template-Parser, nur viel einfacher. Ich will Templates ein eigenen Dateien ablegen, diese dann Einbinden und wie in HEREDOCS Variablen in der Form "{$var}" durch die entsprechenden Variablen ersetzen. Leider sind bisher alle versuche daraufhin hinausgelaufen, dass die eingebundene Datei wie ein Single-Quoted String behandelt wird und $var eben nicht durch den Inhalt der Variable $var ersetzt wird sondern als Text interpretiert wird.

Daher die Frage:
Was könnte man bei "..." einfügen, damit das Beispiel funktioniert?

$var = "Test";
$test = 'Dies ist ein {$var}';
...
echo $test;

Ausgabe: "Dies ist ein Test";

Ist soetwas überhaupt möglich und wenn ja wie? Vielen Dank schon mal im voraus für alle konstruktiven Antworten!

Gruß
Gabriel

  1. Hi,

    Leider sind bisher alle versuche daraufhin hinausgelaufen, dass die eingebundene Datei wie ein Single-Quoted String behandelt wird und $var eben nicht durch den Inhalt der Variable $var ersetzt wird sondern als Text interpretiert wird.

    $var = "Test";
    $test = 'Dies ist ein {$var}';
    ...
    echo $test;

    Wenn du bewusst einen mit single quotes eingeschlossenen String verwendest - wieso wunderst du dich dann, dass er wie ein solcher behandelt wird?

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hi,

      Wenn du bewusst einen mit single quotes eingeschlossenen String verwendest - wieso wunderst du dich dann, dass er wie ein solcher behandelt wird?

      Das mache ich ja nicht absichtlich. Mit dem Beispiel habe ich nur demonstriert was passiert, wenn ich ein Template aus einer anderen Datei include. Also ausführlich:

      include.txt:
      blablabla {var} blablabla

      test.php
      <?php
      $var = "test";
      $string = readfile("include.txt");
      echo $string;

      Ausgabe ist "blablabla {var} blablabla", ich möchte aber blablabla test blablabla" haben. Wie geht das, wenn an der include.txt nichts verändert werden soll?

      Gruß
      Gabriel

      1. Hi,

        include.txt:
        blablabla {var} blablabla

        test.php
        <?php
        $var = "test";
        $string = readfile("include.txt");
        echo $string;

        Ausgabe ist "blablabla {var} blablabla", ich möchte aber blablabla test blablabla" haben. Wie geht das, wenn an der include.txt nichts verändert werden soll?

        Dann musst du einen Parser anwenden, der die Variablen ersetzt.

        Die einfachste Form eines solchen wäre eval - aber auch eine potentiell gefährliche.
        Etwas selbst geschriebenes, das gezielt nur nach solchen Mustern sucht und sie durch Variablenwerte ersetzt, wäre denkbar.

        Aber eigentlich *ist* PHP in sich schon eine Template-Sprache. Man kann also eigentlich auch gut direkt PHP verwenden.
        Noch ein weitere Zwischenschicht einzuziehen, macht das ganze nicht schneller.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hi,

          Dann musst du einen Parser anwenden, der die Variablen ersetzt.

          nicht zwingend, theoretisch wäre es ja auch möglich, vor der Verwendung via PHP eine temp.php zu erstellen mit dem Inhalt

          '<?php'.\n.'$tmpvar = <<<HDOC'.\n.readfile(include.txt).\n.'HDOC;'.\n.'?>'

          Wenn man dann die temp.php included, die Variable $tmpvar verwendet und die temp.php wieder löscht müsste es funktionieren. Aber diese Lösung ist weder schön noch performant. Ich hatte gehofft, dass etwas in diese Richtung auch "sauber" möglich wäre.

          Die einfachste Form eines solchen wäre eval - aber auch eine potentiell gefährliche.
          Etwas selbst geschriebenes, das gezielt nur nach solchen Mustern sucht und sie durch Variablenwerte ersetzt, wäre denkbar.

          Letzteres wäre meine bisherige Notlösung, die ich eigentlich vermeiden will.

          Aber eigentlich *ist* PHP in sich schon eine Template-Sprache. Man kann also eigentlich auch gut direkt PHP verwenden.
          Noch ein weitere Zwischenschicht einzuziehen, macht das ganze nicht schneller.

          Damit magst du recht haben. Aber ich will das template so strikt wie möglich vom PHP-Code trennen, da ich vermute, dass nachher irgendwann mal das Template modifiziert werden soll und der der das macht wird dann vermutlich keine große Ahnung von PHP haben...

          Gruß
          Gabriel

          1. Hi,

            Dann musst du einen Parser anwenden, der die Variablen ersetzt.

            nicht zwingend, theoretisch wäre es ja auch möglich, vor der Verwendung via PHP eine temp.php zu erstellen mit dem Inhalt

            '<?php'.\n.'$tmpvar = <<<HDOC'.\n.readfile(include.txt).\n.'HDOC;'.\n.'?>'

            Wenn man dann die temp.php included, die Variable $tmpvar verwendet und die temp.php wieder löscht müsste es funktionieren.

            Dann hast du trotzdem einen Parser angewandt, bzw. anwenden lassen - den von PHP.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
      2. Mahlzeit Gabriel,

        $var = "test";

        Schreibe hier z.B. stattdessen $vars['var'] = 'test';, lies die Datei ein, ...

        $string = readfile("include.txt");

        ... iteriere über das Array und ersetze die entsprechenden Vorkommen in der Datei.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Hi EKKi,

          Schreibe hier z.B. stattdessen $vars['var'] = 'test';, lies die Datei ein, ...

          $string = readfile("include.txt");

          ... iteriere über das Array und ersetze die entsprechenden Vorkommen in der Datei.

          das hatte ich auch schon angedacht, hatte aber gehofft, dass das ganze auch einfacher und performanter geht, indem das include irgendwie wie ein HEREDOC behandelt wird und die Variablen automatisch erkannt werden. Also praktisch ein sehr simpler Templateparser nur mit PHP-Bordmitteln.

          Gruß
          Gabriel

        2. Hello,

          $string = readfile("include.txt");

          Was willst Du denn in $string nachher drinstehen haben?
          http://de3.php.net/manual/de/function.readfile.php

          Vermutlich wolltest Du file_get_contents() benutzen?
          http://de3.php.net/manual/de/function.file-get-contents.php

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Mahlzeit Tom,

            Was willst Du denn in $string nachher drinstehen haben?

            Nichts.

            Vermutlich wolltest Du file_get_contents() benutzen?

            Nein.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Hello,

              Was willst Du denn in $string nachher drinstehen haben?

              Nichts.

              Vermutlich wolltest Du file_get_contents() benutzen?

              Nein.

              Wie soll ich das jetzt verstehen?

              Ich würde in $string das Template einlesen und dann die Paltzhalter darin mittels str_replace() oder str_ireplace() gegen die vorberechneten Werte ersetzen.

              readfile() hilft dafür gar nicht.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Mahlzeit Tom,

                Vermutlich wolltest Du file_get_contents() benutzen?

                Nein.

                Wie soll ich das jetzt verstehen?

                Merke Dir meinen Namen, folge dem Link und vergleiche den gemerkten Namen mit dem des Threaderstellers.

                Nochmal: *ich* will hier weder file_get_contents() noch sonst irgendwas benutzen.

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                1. Hallo Tom & EKKi,

                  ich habe eigentlich auch file_get_contents() gemeint. Mit der Darstellung wollte ich ja nur das Problem kurz anreißen und habe daher nicht den etwas umfangreichen Quellcode hier ins Forum kopiert sondern hier ein paar ungetestete Zeilen geschrieben die das Problem darstellen sollen. Da habe ich wohl auf die Schnelle den falschen Funktionsnamen erwischt, was aber der Verständlichkeit des Problems keinen Abbruch tun sollte.

                  Gruß
                  Gabriel