【问题标题】:Is it possible to use php tags inside ob_start buffer?是否可以在 ob_start 缓冲区中使用 php 标签?
【发布时间】:2012-03-29 19:07:33
【问题描述】:

我正在尝试制作复杂的模板库。问题是我将自己的语法和 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;
?>

结果应该是“

123
”。目前我只得到 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 博文。

喜欢这里:

<?php
  $asd = "123";
  ob_start();
  eval ('?>
    <?php foreach(array("asd", "asx123") as $data): ?>
    <div><?php echo $data ?></div>
    <?php endforeach; ?>
  <?php;');
  ob_flush();
?>

【问题讨论】:

  • PHP 标记不嵌套,如果这是您的要求。
  • 我无法想象像你那样做的好处。我所知道的是这非常丑陋......
  • 这个例子是非正式的。我创建的班级可以看到here

标签: php eval echo ob-start


【解决方案1】:

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

更简单的解决方案是使用

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

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

【讨论】:

  • 查看一些已经制作好的库是个好主意。我正在尝试与here 完全相同。但我想从字符串中获取包含数据。
【解决方案2】:

您不需要 PHP 标记。只是:

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

【讨论】:

  • 问题是在我的模板中我有 php 标签。我需要使用。 IE。 一些 html
  • 那么您发布的代码没有用,因为它没有显示您使用模板文件的实际方式。您可能只需要 include() 输出缓冲中的模板文件,这将适当地呈现 PHP 标记。您不能在 echo 语句中使用 &lt;?php ?&gt; 标记。
  • 我更新了示例。也许它可以更好地了解我想要实现的目标。
【解决方案3】:
<?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;
?>

【讨论】:

  • 这样可以正常工作。但我希望模板来自字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2016-01-31
相关资源
最近更新 更多