Reputation: 10379
If I have a hello.php file like this:
Hello, <?php echo $foo; ?>!
I would like to do something like this in some php code:
$text = renderPhpToString('hello.php', array('foo'=>'World'));
and end up with
$text == 'Hello, World!'
Is this possible with standard PHP 5? Obviously I want more complex templates with loops and so forth..
Upvotes: 16
Views: 15301
Reputation: 1400
regarding passing $vars = array('file' => '/etc/passwd');
, you could use extract($vars, EXTR_SKIP);
Upvotes: 2
Reputation:
As Gumbo said you have to check for the $file variable, its a subtle bug that has already bitten me. I would use func_get_arg( i ) and have no variables at all, and a minor thing, i would use require.
function renderPhpToString( )
{
if( is_array( func_get_arg(1) ) ) {
extract( func_get_arg(1) );
}
ob_start();
require func_get_arg( 0 );
return ob_get_clean();
}
Upvotes: 3
Reputation: 655229
You could use some function like this:
function renderPhpToString($file, $vars=null)
{
if (is_array($vars) && !empty($vars)) {
extract($vars);
}
ob_start();
include $file;
return ob_get_clean();
}
It uses the output buffer control function ob_start()
to buffer the following output until it’s returned by ob_get_clean()
.
Edit Make sure that you validate the data passed to this function so that $vars
doesn’t has a file
element that would override the passed $file
argument value.
Upvotes: 36
Reputation: 4292
You can do this with output buffering, but might be better of using one of the many template engines.
Upvotes: 1
Reputation: 190935
http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/
Output buffering might be the place to start.
Upvotes: 2