PHP Eval, который оценивает HTML и PHP

Я возился с шаблонами, и я столкнулся с ситуацией, когда мне нужно эха в браузере создать шаблон, содержащий html и php. Как я могу оценить PHP и отправить его в браузер?

Итак, вот пример (main.php):

<div id = "container"> <div id="head"> <?php if ($id > 10): ?> <H3>Greater than 10!</H3> <?php else: ?> <H3>Less than 10!</H3> <?php endif ?> </div> </div> 

И затем в template.php:

  <?php $contents; // Contains main.php in string format echo eval($contents); // Doesn't work... How do I do this line?? ?> 

EDIT: мой шаблон также позволяет вам вводить данные из контроллера Smarty. Будет ли выходной буфер позволить мне сделать это, а затем оценить мой php. Идеальным является то, что он выполняет первый проход через код и сначала оценивает все теги, а затем запускает php. Таким образом, я могу создавать циклы и прочее, используя данные, отправленные с моего контроллера.

 So maybe a more complete example: <div id = "container"> <div id = "title">{$title}</div> <!-- This adds data sent from a controller --> <div id="head"> <?php if ($id > 10): ?> <H3>Greater than 10!</H3> <?php else: ?> <H3>Less than 10!</H3> <?php endif ?> </div> </div> 

Благодаря!

Если вы пытаетесь сделать это со строкой смешанного HTML / PHP (например, из базы данных, как и я), вы можете сделать это следующим образом:

 eval(' ?>'.$htmlandphp.'<?php '); 

Дополнительная информация: http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (обратите внимание, что это мертвая ссылка с 2014-3-3)

Вместо этого используйте буферизацию вывода. eval() как известно, медленный.

main.php :

 <div id="container"> <div id="title"><?php echo $title; ?></div><!-- you must use PHP tags so the buffer knows to parse it as such --> <div id="head"> <?php if ($id > 10): ?> <H3>Greater than 10!</H3> <?php else: ?> <H3>Less than 10!</H3> <?php endif ?> </div> </div> 

Ваш файл:

 $title = 'Lorem Ipsum'; $id = 11; ob_start(); require_once('main.php'); $contents = ob_get_contents(); ob_end_clean(); echo $contents; 

Результатом этого будет:

Lorem Ipsum

Больше 10!

Не читайте файл, но включайте его и используйте выходной буфер для фиксации результата.

 ob_start(); include 'main.php'; $content = ob_get_clean(); // process/modify/echo $content ... 

редактировать

Используйте функцию для создания новой области переменных.

 function render($script, array $vars = array()) { extract($vars); ob_start(); include $script; return ob_get_clean(); } $test = 'one'; echo render('foo.php', array('test' => 'two')); echo $test; // is still 'one' ... render() has its own scope 
 $contents = htmlentities($contents); echo html_entity_decode(eval($contents)); 

Лучшим решением в вашем случае является объединение output buffer и output buffer

 // read template into $contents // replace {title} etc. in $contents $contents = str_replace("{title}", $title, $contents); ob_start(); eval(" ?>".$contents."<?php "); $html .= ob_get_clean(); echo html; 

Согласно @Josh ответ, более простой способ:

 eval('?>'.$htmlandphp);