我正在尝试制作复杂的模板库。问题是我在混合的同一个文件中持有我自己的语法和php。
首先我的语法被解析并重新格式化。输出通常是html + php作为字符串。我不想制作缓存文件,而是使用包含“中间”模板的字符串。
在这个模板(包含php标签和html的字符串)上,应该执行php操作。
MyComplexTemplate(我的语法+ php)= parse =>模板(HTML + PHP)= exec php =>结果(HTML)
For 2.我正在尝试使用带有echo的ob_start(),但是php标签内的所有内容都会消失。
例如:
<?php
$asd = "123";
ob_start();
echo "<div><?php echo $asd; ?></div>"; // Middle template
$result = ob_get_contents();
ob_end_clean();
echo $result;
?>
结果应为“&lt; div&gt; 123&lt; / div&gt;”。目前我只得到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;
?>
我想实现像here这样的最精确的东西,但require_once应该来自字符串:
实际上,解决方案在本主题PHP: Equivalent of include using eval中。 eval必须与带有php标签的pre和postpadded一起使用。
另外,您应该查看THIS blogpost。
喜欢这里:
<?php
$asd = "123";
ob_start();
eval ('?>
<?php foreach(array("asd", "asx123") as $data): ?>
<div><?php echo $data ?></div>
<?php endforeach; ?>
<?php;');
ob_flush();
?>
答案 0 :(得分:2)
好吧,我在源代码中看到的是<div><?php echo 123; ?></div>
,这正是您所期望的。浏览器将<?php echo 123; ?>
视为单个标记(它不知道)并忽略它。
更简单的解决方案是使用
echo "<div>$asd</div>";
如果你想要某种模板引擎,我建议你看一下已经制作过的引擎,看看它们是如何工作的。对MVC和MVC框架有一个特别的了解。
答案 1 :(得分:0)
您不需要PHP标记。只是:
echo "<div>$asd</div>"; // Middle template
答案 2 :(得分:0)
<?php
$asd = "123";
ob_start();
?>
<div><?php echo $asd; ?></div>
<div><?php include('mytemplate.php'); ?></div>
[...] // some stuff here
<?php
$result = ob_get_contents();
ob_end_clean();
echo $result;
?>