2012-04-13 10 views
8

Eventuali duplicati:
Execute a PHP file, and return the result as a string
PHP capture print/require output in variableCome ottenere i contenuti di inclusione come una stringa?

Sto cercando di ottenere il contenuto di un includono in una stringa. È possibile?

Per esempio, se ho un file test.php:

<?php 
echo 'a is equal to '.$a; 
?> 

ho bisogno di una funzione, diciamo include_to_string per includere il test.php e restituire quello che sarebbe uscita da in in una stringa.

Qualcosa di simile:

<?php 
$a = 4; 
$string = include_to_string(test.php); // $string = "a is equal to 4" 
?> 
+0

@safarov la mia ipotesi è che non è intenzione di valutare la variabile –

+0

penso che non sostituirà $ una nel file test.php. fammi controllare. – ppp

risposta

28
<?php 

    ob_start(); 
    include 'test.php'; 
    $string = ob_get_clean(); 

Penso che è quello che vuoi. Vedi output buffering.

+1

Questa tecnica è definita buffer di uscita per chiunque sia curioso. –

+0

@ Xeon06 Appena aggiunto un collegamento manuale mentre stavi scrivendo il commento! Grazie per il pungolo :-) – DaveRandom

+0

@nickb [No it not] (http://php.net/manual/en/function.ob-get-clean.php), 'ob_end_clean()' restituisce 'bool '. 'ob_get_clean()' è una scorciatoia per chiamare '$ str = ob_get_contents(); ob_end_clean(); ' – DaveRandom

5
ob_start(); 
include($file); 
$contents = ob_get_contents(); // data is now in here 
ob_end_clean(); 
3

Si può fare questo con output buffering:

function include2string($file) { 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

@DaveRandom sottolinea (correttamente) che la questione con avvolgendo questo in una funzione è che lo script ($ file) non avrà accesso ai variabile definita globalmente. Questo potrebbe non essere un problema per molti script inclusi dinamicamente, ma se è un problema per te allora questa tecnica può essere usata (come altri hanno mostrato) al di fuori di un wrapper di funzione.

** Importazione delle variabili Una cosa che si può fare è aggiungere un insieme di dati che si desidera esporre al proprio script come variabili. Pensa a come passare i dati a un modello.

function include2string($file, array $vars = array()) { 
    extract($vars); 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

Si potrebbe chiamarla in questo modo:

include2string('foo.php', array('key' => 'value', 'varibleName' => $variableName)); 

e ora $key e $variableName sarebbe visibile all'interno il file foo.php.

È inoltre possibile fornire un elenco di variabili globali da "importare" per il proprio script, se ciò risulta più chiaro.

function include2string($file, array $import = array()) { 
    extract(array_intersect_key($GLOBALS, array_fill_keys($import, 1))); 
    ob_start(); 
    include($file); 
    return ob_get_clean(); 
} 

E si potrebbe chiamare, fornendo un elenco delle variabili globali gradireste esposti allo script:

$foo='bar'; 
$boo='far'; 
include2string('foo.php', array('foo')); 

foo.php dovrebbe essere in grado di vedere foo, ma non boo.

+0

Il problema con il suo wrapping in una funzione è scope variabile ... – DaveRandom

+0

@DaveRandom, buona chiamata. – Prestaul

+0

questo è quello che stavo facendo male. Ho trovato questo metodo in un'altra risposta, ma ho ottenuto un errore di variabile non dichiarata poiché le variabili sono state dichiarate al di fuori dell'ambito della funzione. – ppp

0

Si potrebbe anche utilizzare questo di seguito, ma io consiglio la risposta di cui sopra.

// How 1th 
$File = 'filepath'; 
$Content = file_get_contents($File); 

echo $Content; 

// How 2th 
function FileGetContents($File){ 
    if(!file_exists($File)){ 
     return null; 
    } 

    $Content = file_get_contents($File); 
    return $Content; 
} 

$FileContent = FileGetContents('filepath'); 
echo $FileContent; 

funzione in manuale di PHP: file_get_contents

+0

Questo ottiene il contenuto ma non eseguirà il PHP nell'include e restituirà il codice PHP grezzo. – MrCode

+0

Vero, non ho visto la parola chiave eseguita nel post OP ... Potrei aver frainteso la domanda. –

+0

@MrCode Suppongo che tu possa 'eval()' (diabolico), ma soffre ancora il problema della scope variabile che ottieni dal farlo in una funzione ed è probabilmente più costoso di un semplice 'include()' ing primo posto – DaveRandom

Problemi correlati