输出缓冲和对也包含 ECHO 的 HTML 字符串调用 ECHO


Output buffering and calling ECHO on an HTML string also containing ECHO

我有一个模板文件,其中包含带有内联 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来实现这种事情,但在这种情况下,尽管示例代码很简洁,但将模板放入内存的原因有很多(主要是因为每个模板可能位于需要相互解析的模板层次结构中,从而更改了原始模板结构)。

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

我希望这个问题是清楚的,并希望就我的方法是否应该有效以及如果是,我可能做错了什么提供任何建议/想法。

这是你的问题:

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

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

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

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

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