2010-08-09 58 views
4

我正在寻找一种更好的方法来从php生成动态html。在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> 

回答

1

使用Smarty TPL等模板引擎。这就是他们。

它们都将HTML显示与逻辑分开,并提供便利的功能来生成繁琐的事情,如HTML单选按钮。

+0

一年后,我正在使用Smarty。这很棒!谢谢! – Samuel 2011-06-03 15:29:20

0

为什么不把php内联?你能告诉我们为什么你需要在输出前存储它吗?

for(...) 
{ 
    ?><a id="<?php echo $i; ?>">link <?php echo $i; ?></a><?php 
} 

你真的不应该使用短标签。

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> 
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> 

你可以调用markup()在您的for循环中:

for(...) 
{ 
    $markup .= markup($i); 
}