Datei einlesen und ausgeben, aber PHP-Code verarbeiten
MrSnoot
- php
0 suit0 MrSnoot
0 Vinzenz Mai0 Der Martin0 MrSnoot
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(""","",$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?
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
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).
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
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
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 :)