输出缓冲并在包含ECHO

时间:2016-03-18 15:57:50

标签: php output-buffering

我有一个模板文件,其中包含带有内联PHP echo语句的html。例如,模板可能如下所示:

<div class="<?php echo $classes ?>">

    <div class="uk-container uk-container-center">

        <section class="uk-grid uk-grid-match" data-uk-grid-match="{target:'> div > .uk-panel'}" data-uk-grid-margin>

            <?php echo $content ?>

        </section>

    </div>

</div>

使用file_get_contents()在脚本中读取模板。然后我打开输出缓冲。变量$classes$content在调用ob_start()时属于范围。

ob_start();

echo $htmlTemplateString;

$resolvedMarkup = ob_get_clean();

不幸的是,$ resolvedMarkup包含从模板文件中读取的原始字符串,并且内联的echo语句仍然存在,并且未解析为引用变量的值。

我的问题是,我是否正确地解释了这种用法?我应该回来一个完全解析的字符串吗?

通常情况下,我可以使用include来实现这类功能,但在这种情况下,尽管示例代码简洁,但模板被带入内存的原因很多(主要是因为每个模板可能都是在需要相互解析的模板层次结构中,改变原始模板结构。)

在这个阶段,我试图避免使用临时文件。

我希望这个问题很明确,并希望我的方法是否有用,以及如果可行,我可能做错了什么的任何建议/想法。

2 个答案:

答案 0 :(得分:0)

这是你的问题:

  

使用file_get_contents()在脚本中读取模板。

file_get_contents()几乎相当于fopen(); fread(); fclose()。它只是将文件中的字节变为变量。这些字节不会被执行,因此该文件中的任何PHP代码块都可以保留为<?p等...字符 - 它们不会被执行/替换。

您需要使用include()代替。这将执行字节流中的任何PHP代码。

答案 1 :(得分:0)

只是echo实际上并不解析任何PHP。你需要的是eval。 在这里,我必须将我的模板转换为可以通过php解析的文本。

<?php
$str1 = " this is <?php echo \$i;?> now\n";
$i=99;
echo eval('?>' . $str1 . '<?php ');