PHP Eval, который оценивает HTML и PHP - PullRequest
10 голосов
/ 21 августа 2009

Я возился с шаблонами и столкнулся с ситуацией, когда мне нужно отобразить в браузере шаблон, содержащий 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??
   ?>

РЕДАКТИРОВАТЬ: Мой шаблон также позволяет вводить данные из контроллера в стиле 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>

Спасибо!

Ответы [ 5 ]

38 голосов
/ 22 января 2010

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

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

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

13 голосов
/ 21 августа 2009

Вместо этого используйте выходную буферизацию. 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;

Вывод этого будет:

Лорем Ипсум

Больше 10!

2 голосов
/ 21 августа 2009

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

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
1 голос
/ 29 июня 2013

Лучшее решение в вашем случае - объединить eval и 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;
1 голос
/ 05 октября 2012
$contents = htmlentities($contents);
echo html_entity_decode(eval($contents));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...