是否可以在ob_start缓冲区中使用php标签?

时间:2012-03-29 19:07:34

标签: php eval echo ob-start

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

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

  2. 在这个模板(包含php标签和html的字符串)上,应该执行php操作。

  3. 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();
    ?>
    

3 个答案:

答案 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;
?>