PHP Eval评估HTML& PHP

时间:2009-08-21 02:20:12

标签: php templates

我正在弄乱模板,我遇到了一种情况,我需要在浏览器中回显一个包含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 个答案:

答案 0 :(得分:37)

如果您尝试使用混合HTML / PHP的字符串(就像我在数据库中那样),您可以这样做:

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

更多信息:http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/(请注意,这是2014-3-3的死链接)

答案 1 :(得分:13)

使用输出缓冲。 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!

答案 2 :(得分:2)

不要读取文件,但要包含它并使用输出缓冲来捕获结果。

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

答案 3 :(得分:1)

$contents = htmlentities($contents);
echo html_entity_decode(eval($contents));

答案 4 :(得分:1)

您的最佳解决方案是合并evaloutput 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;