MrSnoot: Datei einlesen und ausgeben, aber PHP-Code verarbeiten

Hi,

ich binde eine PHP-Datei (#1) in eine andere (#2) ein, das ganze geschieht via file_get_contents();. In (#1) befindet sich PHP-Code, der auch verarbeitet werden soll, durch diese Einleseprozedur wird der PHP-Code dann aber einfach auf der Seite im HTML-Quelltext mit ausgegeben. Auf php.net habe ich gesehen, dass es dafür wohl Funktionen gibt (ob_start), mit denen man das Problem lösen kann, allerdings schaffe ich es nicht, dass in mein Script einzuarbeiten (vielleicht ist's auch der falsche Ansatz). Mein Script sieht so aus:

<?php  
  
  $bereich = $_GET['bereich'];  
  $datei = "$bereich/themen/$thema.php";  
  $einlesen = file_get_contents($datei);  
  
  ###  
  ##Abfrage ob Suchbegriff eingegeben wurde  
  if(isset($_GET['suchbegriff']))  
  {  
    $highlight = htmlentities($_GET['suchbegriff']);  
    $highlight = preg_replace('[\-]',' ', $highlight);  
  
    ###  
    ##Funktion um mehrere Suchbegriff zu trennen  
  
    function WortMarkieren($einlesen, $highlight)  
    {  
      if(substr($_GET['suchbegriff'],0,1) == "\"" && substr($_GET['suchbegriff'],-1,1) == "\"") ## Prüfen ob Suchbegriff von "..." eingeschlossen ist  
      {  
        $search_str = str_replace("&quot;","",$highlight);  
        ###  
        ##RegExp um Suchbegriffe nur außerhalb von HTML-Tags zu ersetzen (http://www.php-faq.de/q/q-regexp-ersetzen.html)  
        $einlesen = preg_replace("/((<[^>]*)|$search_str)/ie", '"\2"=="\1"? "\1":"<span class=\"suchbegriff\">\1</span>"', $einlesen);  
      }  
      else  
      {  
        $highlight = split(" ",$highlight); ##Mehrere Suchbegriffe ohne "" einzeln verarbeiten  
  
        foreach($highlight as $search_str)  
        {  
  
        ###  
        ##RegExp um Suchbegriffe nur außerhalb von HTML-Tags zu ersetzen (http://www.php-faq.de/q/q-regexp-ersetzen.html)  
        $einlesen = preg_replace("/((<[^>]*)|$search_str)/ie", '"\2"=="\1"? "\1":"<span class=\"suchbegriff\">\1</span>"', $einlesen);  
        }  
      }  
    return $einlesen;  
    }  
    echo WortMarkieren($einlesen,$highlight);  
  }  
  else  
  {  
    echo $einlesen;  
  }  
  
?>

Gibt's ne Möglichkeit, das zu realisieren?

  1. Auf php.net habe ich gesehen, dass es dafür wohl Funktionen gibt (ob_start), mit denen man das Problem lösen kann

    ob_start hat nicht wirklich etwas mit dem parsen von php-code zu tun - es ist eher das "gegenteil" von flush()

    Gibt's ne Möglichkeit, das zu realisieren?

    du suchst eval(), aber bedenke: <?php eval() === evil; ?>, sprich falsch eingesetzt ein enormes sicherheitsrisiko

    1. du suchst eval(), aber bedenke: <?php eval() === evil; ?>, sprich falsch eingesetzt ein enormes sicherheitsrisiko

      Danke, etwas kompliziert in meinem Fall, aber es klappt :)

      @ Vinzenz Mai: nein, da einzelne Wörter der einzubindenden Datei ja ggf. verändert werden (siehe mein obiges Script).

  2. Hallo,

    ich binde eine PHP-Datei (#1) in eine andere (#2) ein, das ganze geschieht via file_get_contents();. In (#1) befindet sich PHP-Code, der auch verarbeitet werden soll, durch diese Einleseprozedur wird der PHP-Code dann aber einfach auf der Seite im HTML-Quelltext mit ausgegeben.

    ich vermute Du suchst include oder require (oder ihre _once-Varianten).

    Freundliche Grüße

    Vinzenz

  3. Hallo,

    ich binde eine PHP-Datei (#1) in eine andere (#2) ein, das ganze geschieht via file_get_contents();. In (#1) befindet sich PHP-Code, der auch verarbeitet werden soll, durch diese Einleseprozedur wird der PHP-Code dann aber einfach auf der Seite im HTML-Quelltext mit ausgegeben.

    ich finde es zwar ungewöhnlich, was du da tust - aber wenn ich dich richtig verstehe, möchtest du in einem String die *Ausgabe* eines anderen PHP-Scripts bekommen.

    Dann ist der Ansatz mit file_get_contents() gar nicht schlecht. Schau mal nach, ob url_fopen_wrapper bei deinem Hoster aktiviert ist. Wenn ja, dann kannst du das gewünschte PHP-Scriptausgabe mit file_get_contents() erfassen, indem du nicht über den Dateinamen darauf zugreifst, sondern über HTTP.

    Interessanterweise taucht deine Frage hier häufig in genau der umgekehrten Konstellation auf. Also so, dass jemand aus Unkenntnis über HTTP auf eine PHP-Scriptdatei zugreift und sich dann wundert, warum Variablen oder Funktionen aus dem eingebundenen Script nicht zur Verfügung stehen.

    $bereich = $_GET['bereich'];
      $datei = "$bereich/themen/$thema.php";
      $einlesen = file_get_contents($datei);

    Genau, und hier einfach über die HTTP-URL zugreifen, anstatt direkt auf die Datei. Übrigens ist erstens das Umkopieren von GET/POST-Parametern meistens unnötig, manchmal sogar eine Fehlerquelle (weil die Herkunft der Daten verschleiert wird), zweitens ist es problematisch, Fremddaten ($_GET) ungeprüft zu übernehmen: Wenn jemand ?bereich=../../fremdesverzeichnis angibt, kann er lustig auf Dateien zugreifen, von denen du nicht einem etwas ahnst. Das wäre beim HTTP-Zugriff dann auch nicht mehr möglich ...

    So long,
     Martin

    --
    Wenn Zeit das Kostbarste ist, was wir haben, dann ist Zeitverschwendung die größte aller Verschwendungen.
      (Benjamin Franklin, amerikanischer Tüftler und Politiker)
    1. Dann ist der Ansatz mit file_get_contents() gar nicht schlecht. Schau mal nach, ob url_fopen_wrapper bei deinem Hoster aktiviert ist. Wenn ja, dann kannst du das gewünschte PHP-Scriptausgabe mit file_get_contents() erfassen, indem du nicht über den Dateinamen darauf zugreifst, sondern über HTTP.

      Danke, das werd ich mal probieren.

      zweitens ist es problematisch, Fremddaten ($_GET) ungeprüft zu übernehmen: Wenn jemand ?bereich=../../fremdesverzeichnis angibt, kann er lustig auf Dateien zugreifen, von denen du nicht einem etwas ahnst.

      Nein kann man nicht, beliebige Eingaben werden zuvor schon abgefangen :)