ebody: [php] Text mit Variable einbinden

Hallo

ich habe eine Datei "text.txt" mit folgendem Inhalt:

"Das ist ein Test: $var"

In einer PHP Datei binde ich "text.txt" per include ein und setze vorher die Variable $var.

$var = "hallo welt!";
include "test.txt";

Die Variable $var wird im Text nicht ersetzt und wird als String ausgegeben. Ich habe schon verschiedene Varianten ausprobiert, hat aber leider keine funktioniert:

  1. "Das ist ein Test: $$var"
  2. "Das ist ein Test: ".$var
  3. "Das ist ein Test: {$var}"
  4. "Das ist ein Test: "".$var
  5. "Das ist ein Test: $var"
  6. "Das ist ein Test: $$var"

Hat jemand einen Tipp?

Gruß ebody

  1. Tach!

    In einer PHP Datei binde ich "text.txt" per include ein und setze vorher die Variable $var.

    Für include und Co. beginnt die einzuladende Seite im Nicht-PHP-Modus.

    ich habe eine Datei "text.txt" mit folgendem Inhalt:

    "Das ist ein Test: $var"
    

    Das wird nicht als PHP-Code erkannt, weil da kein <?php voranging. Ein echo oder ähnliches (oder <?=) fehlt auch. Sonst ist das nur ein einsam in der Gegend stehendes Stringliteral.

    dedlfix.

    1. Hallo,

      Das wird nicht als PHP-Code erkannt, weil da kein <?php voranging.

      Je nach Konfiguration wäre es auch sinnvoll, die Datei „Text.php“ zu nennen.

      Gruß
      Kalk

      1. Tach!

        Das wird nicht als PHP-Code erkannt, weil da kein <?php voranging.

        Je nach Konfiguration wäre es auch sinnvoll, die Datei „Text.php“ zu nennen.

        Also, nicht für include. Aber andere Gründe können relevant sein. Liegt diese Datei innerhalb des DocumentRoot, kann man sie üblicherweise per Request aufrufen. Wenn sie dann .txt heißt, wird sie im Original ausgeliefert und kann unter Umständen Code offenbaren. Wenn sie auf .php endet, lässt sie der Apache ausführen und liefert ihr Ergebnis aus. Sie sollte also so aufgebaut sein, dass beim separaten Ausführen kein wichtiger Code gestartet wird. Am besten ist es jedoch, solche nicht direkt auszuliefernden Dateien abseits des DocumentRoot zu lagern. Ob und wie das geht, hängt von den Gegebenheiten beim Hoster ab.

        dedlfix.

    2. ich würde das sinngemäß so lösen (nicht getestet):

      $var = 5 +2;
      echo str_replace ( '$var', $var, file_get_contents( "text.txt" ));
      
      

      Die vier Zeichen $var der Textdatei werden ersetzt durch den Wert in der Variablen $var.

      Sicherheitshalber die einfachen Gänsefüße benutzen, sonst interpretiert PHP das doch noch als Variable. text.txt ist dann schon eine kleine Template-Datei.

      Linuchs

      1. Tach!

        ich würde das sinngemäß so lösen (nicht getestet):

        $var = 5 +2;
        echo str_replace ( '$var', $var, file_get_contents( "text.txt" ));
        

        So will man das nicht haben, weil dann jede Variable eine Extrawurst braucht.

        Man kann ruhig PHPs eingebaute Template-Fähigkeiten verwenden.

        Das ist ein Test: <?=htmlspecialchars($var)?>
        

        Somit wird auch gleich noch der Kontextwechsel beachtet. Vorausgesetzt, $var enthält nur Daten und keinen HTML-Code.

        Sicherheitshalber die einfachen Gänsefüße benutzen, sonst interpretiert PHP das doch noch als Variable. text.txt ist dann schon eine kleine Template-Datei.

        Das ist nicht nur ein (sinngemäßes) "eventuell", sondern garantiertes Verhalten, dass bei doppelten Anführungszeichen das $var nicht literal stehen bleibt.

        dedlfix.

        1. @@dedlfix

          Das ist ein Test: <?=htmlspecialchars($var)?>
          

          Somit wird auch gleich noch der Kontextwechsel beachtet.

          Welcher Kontextwechsel?

          Warum sollte man htmlspecialchars() anwenden, wenn man eine Textdatei (-ressource? Na jedenfalls text/plain) generiert?

          LLAP 🖖

          --
          “There’s no such thing as an ‘average’ user, but there is such a thing as an average developer.” —Vitaly Friedman in Accessibility Matters: Meet Our New Book, “Inclusive Design Patterns”
          Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
          1. Tach!

            Das ist ein Test: <?=htmlspecialchars($var)?>
            

            Somit wird auch gleich noch der Kontextwechsel beachtet.

            Welcher Kontextwechsel?

            Warum sollte man htmlspecialchars() anwenden, wenn man eine Textdatei (-ressource? Na jedenfalls text/plain) generiert?

            Welche Textressource?

            Dass da eine Textdatei inkludiert wird, heißt nicht automatisch, dass die Ausgabe des Scripts text/plain ist. Allerdings kann man aus dem gegebenen Beispiel gar nicht entnehmen, von welchem Content-Type die Ausgabe ist. Eine eventuell vorhandener header()-Aufruf wird nicht gezeigt. Ich ging vom Default-Wert text/html aus. Muss nicht der Fall sein, aber da kann der OP ja auch intervenieren, wenn das nicht der Fall ist.

            dedlfix.

            1. @@dedlfix

              Welche Textressource?

              „ich habe eine Datei "text.txt"“

              Ich konnte nirgends erkennen, dass der OP vorhat, den Text in HTML einzubetten.

              LLAP 🖖

              --
              “There’s no such thing as an ‘average’ user, but there is such a thing as an average developer.” —Vitaly Friedman in Accessibility Matters: Meet Our New Book, “Inclusive Design Patterns”
              Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
              1. Tach!

                „ich habe eine Datei "text.txt"“

                Ich konnte nirgends erkennen, dass der OP vorhat, den Text in HTML einzubetten.

                Richtig, diese Textdatei sagt aber auch nichts über das Ziel aus und HTML als Default-Fall kann auch nicht ausgeschlossen werden. Ich ergänze den fraglichen Satz noch:

                Somit wird auch gleich noch der Kontextwechsel beachtet. Vorausgesetzt, $var enthält nur Daten und keinen HTML-Code, und die Ausgabe ist ein HTML-Dokument.

                dedlfix.