1

我正在尝试制作复杂的模板库。问题是我将自己的语法和 php 保存在同一个文件中作为混合。

  1. 首先我的语法被解析并重新格式化。输出通常是 html + php 作为字符串。我不想制作缓存文件,而是使用包含“中间”模板的字符串。

  2. 在这个模板(包含 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();
?>
4

3 回答 3

2

好吧,我在源代码中看到的是<div><?php echo 123; ?></div>,这正是您所期望的。浏览器将<?php echo 123; ?>其视为单个标签(它不知道)并忽略它。

更简单的解决方案是使用

echo "<div>$asd</div>";

如果你想要某种模板引擎,我建议你看看已经制作的引擎,看看它们是如何工作的。看一看 MVC 和 MVC 框架。

于 2012-03-29T19:11:16.260 回答
0

您不需要 PHP 标记。只是:

echo "<div>$asd</div>"; // Middle template
于 2012-03-29T19:09:07.460 回答
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;
?>
于 2012-03-29T19:16:48.940 回答