我正在寻找一种从php生成动态html的更好方法。
在我做这样的事情之前:
//generate.php
for(...)
{
$markup .= '<a id="'.$i.'">link'.$i.'</a>';
}
这真的很难看,我更不希望在php字符串中内联定义我的标记。
我正在寻找include "markup.php";
的功能,但我需要能够将结果存储到字符串中,而不是立即输出。像下面这样的东西会很棒。
//generate.php
for(...)
{
$markup .= include "markup.php";
}
//markup.php
<a id="<?=$i?>">link<?=$i?></a>
答案 0 :(得分:1)
使用模板引擎,如Smarty TPL。这就是它们。
它们将HTML显示与逻辑分开,并提供便利功能来生成HTML单选按钮等繁琐的东西。
答案 1 :(得分:1)
我相信只要你的包含文件以return语句结束,第二种方法就可以正常工作。但是,为什么不使用模板引擎,例如Smarty?
在Smarty中(我确定还有其他的仍然存在循环,但它们都适用于标记。在调用display()方法之前,模板的结果也不会输出。这允许你分配任何东西你需要的变量。你的例子会像:
PHP:
$links = array('http://stackoverflow.com/','http://google.com'); // whatever you're looping over.
$smarty->assign('links', $links);
// ... other processing ... etc.
$smarty->display('path/to/template.tpl');
模板:
<html>
<body>
{foreach from=$links item=$link }
<a href="{$link}">link {$link}</a>
{/foreach}
</body>
</html>
答案 2 :(得分:1)
你可以这样做:
ob_start();
include 'yourfile.php';
$markup = ob_get_contents();
查看输出缓冲的其他功能:http://www.php.net/manual/en/ref.outcontrol.php。
答案 3 :(得分:0)
为什么不抛出php内联?你能告诉我们为什么你需要在输出之前存储它吗?
for(...)
{
?><a id="<?php echo $i; ?>">link <?php echo $i; ?></a><?php
}
你真的不应该使用短标签。
答案 4 :(得分:0)
在@jcmonkey的建议基础上,您可以编写如下函数:
function markup($i) {
ob_start();
include 'markup.php';
return ob_get_contents();
}
...文件markup.php
如下所示:
<?php /* I don't like using short_open_tag */ ?>
<a id="<?php echo $i; ?>">link<?php echo $i; ?></a>
然后,您可以在for循环中调用markup()
:
for(...)
{
$markup .= markup($i);
}