我正在尝试制作复杂的模板库。问题是我将自己的语法和 php 保存在同一个文件中作为混合。
首先我的语法被解析并重新格式化。输出通常是 html + php 作为字符串。我不想制作缓存文件,而是使用包含“中间”模板的字符串。
在这个模板(包含 php 标签和 html 的字符串)上应该执行 php 操作。
MyComplexTemplate(我的语法 + php) =parse=> 模板(HTML+PHP) =exec php=> 结果(HTML)
对于 2. 我正在尝试将 ob_start() 与 echo 一起使用,但 php 标签内的所有内容都消失了。
例如:
<?php
$asd = "123";
ob_start();
echo "<div><?php echo $asd; ?></div>"; // Middle template
$result = ob_get_contents();
ob_end_clean();
echo $result;
?>
结果应该是“<div>123</div>”。目前我只得到 div 标签。
这只是一个简单的例子。我的模板将包含 php 标签内的所有类型的 php 操作。
这种操作是否可能以某种方式进行?
更新
模板即:(template.php)
.mySyntax (...) and so on
<?php foreach($asd as $data): ?>
<div><?php echo $data ?></div>
<?php endforeach; ?>
.mySyntax
some text
使用 MySyntaxParser 解析模板并在此之后执行 php,保持不变:
<?php
$t = new MySyntaxParser("template.php"); // My parser. Converts mySyntax to html.
$asd = array("test1", "test2");
ob_start();
echo $t->parse(); // Should execute php code inside the string;
$result = ob_get_contents();
ob_end_clean();
echo $result;
?>
更新
我想像这里一样实现最精确的东西,但 require_once 应该以某种方式来自字符串:
解决方案
实际上解决方案在这个主题PHP: Equivalent of include using eval中。eval 必须与带有 php 标签的 pre 和 postpadded 一起使用。
你也应该看看这篇博文。
像这儿:
<?php
$asd = "123";
ob_start();
eval ('?>
<?php foreach(array("asd", "asx123") as $data): ?>
<div><?php echo $data ?></div>
<?php endforeach; ?>
<?php;');
ob_flush();
?>