Pragerer: PHP: TExtdatei einlesen und Variablen ersetzen

Hallo!

Ich habe eine Textdatei, die ich mit

$fileContent = file_get_contents;

einlese.

In dieser Textdatei sind Variablen, z.B. "$url" eingebaut, die ich gern vor der Ausgabe der Textdatei auf dem Bildschirm durch den aktuellen, im PHP-Skript für den für $url bestimmten Wert, ersetzen will.

Geht das nur mit str_replace und entsprechenden Platzhaltern?

Danke!

  1. Tach!

    In dieser Textdatei sind Variablen, z.B. "$url" eingebaut, die ich gern vor der Ausgabe der Textdatei auf dem Bildschirm durch den aktuellen, im PHP-Skript für den für $url bestimmten Wert, ersetzen will. Wie muss ich da vorgehen?

    Es gibt mehrere Möglichkeiten. Die eine ist Suchen und Ersetzen. Die Schwierigkeit dabei ist, entweder ein Muster für einen regulären Ausdruck zu erstellen, und dann irgendwas mit preg_replace() bauen, oder die Variablennamen zu kennen, die es zu ersetzen gilt und strtr() (zweite Syntax laut Doku) oder Konsorten zu verwenden.

    Wenn die Variablen in einem Scope liegen und keine weiteren Variablen in diesem Scope zu finden sind, kann man eine Liste mit get_defined_vars() erhalten. Das wäre der erste Schritt für den zweiten oben genannten Teil.

    dedlfix.

    1. Tach

      :)

      Also ich glaube, es wird wohl ein einfaches Suchen&Ersetzen werden.

      In der Textdatei sind quasi Platzhalter für URLs drin. Damit ich nicht jedes mal, wenn sich die URLs ändert, das in allen Dateien ändern muss.

      Ich dachte, es gibt evtl. eine Möglichkeit, dass ich in der Textdatei ganz normal die PHP-Variable eingebe "...Für das Impressum gilt dieser Link: $impressumUrl ... und für Kontakt dieser Link: $kontaktUrl" und dann, wenn die Datei eingelesen wurde, ich mit einem eventuellen PHP-Befehl anweisen kann, dass der Text PHP-geparst wird und $impressumUrl/ $kontaktUrl/ ... durch die vom Skript ermittelten URLs ersetzt wird.

      Vielen Dank für deinen Rat!

      1. Tach!

        Ich dachte, es gibt evtl. eine Möglichkeit, dass ich in der Textdatei ganz normal die PHP-Variable eingebe "...Für das Impressum gilt dieser Link: $impressumUrl ... und für Kontakt dieser Link: $kontaktUrl" und dann, wenn die Datei eingelesen wurde, ich mit einem eventuellen PHP-Befehl anweisen kann, dass der Text PHP-geparst wird und $impressumUrl/ $kontaktUrl/ ... durch die vom Skript ermittelten URLs ersetzt wird.

        Ja, die gibt es auch. Du brauchst dazu aber eval() (was nicht umsonst sehr verschriehen ist). Und dann musst du sicherstellen, dass das, was du da dem eval() übergibst, ein String ist mit gültigem PHP-Code. Du müsstest den Text in Anführungszeichen einrahmen und dem ein $foo = oder ähnliches voranstellen. Es dürfen auch keine Anführungszeichen im Text sein, oder sie müssen nach PHP-Regeln maskiert sein, sonst gibt es Syntax-Fehler. Oder unter Umständen irgendwelchen Code, den du eigentlich nicht ausführen wolltest, besonders dann, wenn du nicht selbst die Kontrolle über den Text hast. Diesen Weg habe ich absichtlich nicht empfehlen wollen und deshalb in der ersten Antwort ausgespart.

        dedlfix.

      2. Hallo,

        In der Textdatei sind quasi Platzhalter für URLs drin. Damit ich nicht jedes mal, wenn sich die URLs ändert, das in allen Dateien ändern muss.

        Was spricht denn dagegen, einfach eine PHP-Datei zu includieren?

        Gruß
        Kalk

        1. Tach!

          In der Textdatei sind quasi Platzhalter für URLs drin. Damit ich nicht jedes mal, wenn sich die URLs ändert, das in allen Dateien ändern muss.

          Was spricht denn dagegen, einfach eine PHP-Datei zu includieren?

          Dann müsste das nicht nur eine Textdatei sein, sondern komplett gültiger PHP-Code, inklusive htmlspecialchars()-Aufrufe, wenn das Ziel HTML ist.

          dedlfix.

        2. Hallo und guten Tag,

          Was spricht denn dagegen, einfach eine PHP-Datei zu includieren?

          Was spricht dagegen, einfach str_replace($_search, $_replace, $input) zu benutzten? $_search ist ein Array mit den gesuchten Variablen, geordnet nach ihrer Länge (längste zuerst) und $_replace ist das Array mit den dazugehörigen Ersetzungen.

          Man hat selbstverständlich dabei gewisse Beschränkungen.

          Wenn im Text jetzt steht ich esse keine $fischsuppeund im Sucharray steht nur$fischwird natürlich der Teil in$fischsuppeleider ersetzt. Abhilfe: keine PHP-Variablen benutzen, sondern gezielt gebaute Platzhalter[[fisch]], [[fischsuppe]]`

          $_begriffe = array();
          $_begriffe['[[fisch]]'] = 'Lachs';
          $_begriffe['[[fischsuppe]]'] = 'Bouillabaisse';
          $_begriffe['[[autor]]'] = 'Pragerer';
          
          $_search = array_keys($_begriffe);
          $neuer_text = str_replace($_search, $_begriffe, $alter_text);
          
          

          Den include '...'-Hammer würde ich vermeiden, wo immer das geht, eval() nur in der allergrößten Not in abgesicherten Modulen einsetzen, also solchen, die keine Daten von außen beziehen.

          Grüße
          TS

          --
          es wachse der Freifunk
          http://freifunk-oberharz.de
  2. Hallo,

    Geht das nur mit str_replace und entsprechenden Platzhaltern?

    Dieses Kommando ist zumindest der Kern. Nun kommt es darauf an, wie umfangreich deine Textdatei ist. Ich baue ein array mit den Daten auf und durchlaufe dann eine Template-Datei zeilenweise.

    Das liegt aber daran, dass meine Templates sogenannte sections haben und ich nur die Zeilen einer section betrachte, nicht die ganze Datei.

    mein_template.htm

    <html>
    ...
    <p>Kennt ihr schon <a href="[url]">[bemerkung]</a>?</p>
    
    $arr = array (
     '[url]'       => 'https://forum.selfhtml.org/'
    ,'[bemerkung]' => 'Das Forum für Web-Entwickler'
    );
    
    $datei = file( "mein_template.htm" );
    ...
    for ( $i=0; $i<count($datei); $i++ ) {
      foreach( $arr as $key => $val ) {
        echo str_replace( $key, $val, $datei[$i] );
      }
    }
    

    Linuchs