使用str_replace数组进行高级php模板化

时间:2012-11-20 20:17:29

标签: php str-replace templating

我创建了一些模板系统来帮助我以可换肤的方式输出数据库项。它的工作原理如下:

$tpl = "<html>
<body>
<div><span class="item">Favourite food:</span><span class="content">{item1}</span></div>
<div><span class="item">Hobby:</span><span class="content">{item2}</span></div>
<div><span class="item">Allergies:</span><span class="content">{item3}</span></div>
// up to 500 more lines like this
</body>
</html>";

$output = str_replace( 
array('{item1}','{item2}','{item3}') ) , 
array($database['item1'],$database['item2'],$database['item3']) , 
$tpl );

echo $output;

现在我的问题是:并非每个数据库项都必须包含内容 - 所以,目前我得到这样的输出

  

最喜欢的食物:香蕉   爱好:{item2}   过敏症:Apple

有没有办法使用这种系统并省去没有数据库条目的行?输出应该是这样的:

  

最喜欢的食物:香蕉   过敏症:Apple

我怎么能实现这个目标?

更新:描述文本也可能有所不同,因此我更新了示例代码。我想避免foreach或for循环,因为那时模板本身就被打破了。我希望能够插入随机HTML。目前使用smarty或其他模板系统是不可行的。但我可以提供第三个包含描述的数组。

更新2:我认为也许$ output上的preg_replace可能会成功?所以这意味着“如果有一个html标签在$ output上的某个地方包含{}括号那么擦除整个标签到(我相应地更新了我的代码) 你怎么看?你知道任何可以做到这一点的reg_expression吗?

5 个答案:

答案 0 :(得分:2)

此代码可以使用:

<?php

$database = array(
"item1" => "banana",
"item2" => "apple",
"item3" => "cherry",
);

$output = '<html>
<body>';

for($i=1;$i<500;$i++) //change 500 with the desired number or setup a dynamic variable
{
    if(isset($database['item'.$i])) //if the current item is set
    {
$output .= '<span class="item">Description for item '.$i.': </span><span class="content">'.$database['item'.$i].'</span>'; //append to $output
$output .= '<br />'; //Here I add a line break, remove if you don't want
    }
}
$output .= '</body></html>';

echo $output;

?>

您将看到,如果$ database数组中没有项目,则不会打印出该项目。 当然,您可以在代码开头删除$ database数组(此处用于测试目的)并使用您自己生成的$ database数组。

在您的特定情况下:如果您想开发自己的模板引擎,可以在模板中使用特殊字符串(您发明)(例如 { - ITEMS - } )然后在第二个读取模板的PHP文件中处理这些字符串,查找字符串并用一些输出替换它们。要做到这一点,您在此处发布的代码中缺少的要点是输出的“构造”,它将替换模板中的固定字符串。您可以通过处理数据库并将结果(使用。= )附加到刚结束的变量或者可以用来替换您的数据来构建输出固定字符串。

答案 1 :(得分:1)

我赞成维护你想要的值的数组(也可能来自数据库),并控制是否显示你的数据库结果(在这里显示为$ row)。这样你也可以组合在寻找匹配时显示的标签

$row= array(
"item1" => "banana",
"item2" => "apple",
"item3" => "cherry",
);

$items = array(
'item1'=>'Favourite Food', 
'item2'=>'Hobbies:',
'item3'=> 'Allergies'
);

foreach($items as $k=>$item){

if (isset($row[$k]) {
// concat a variable
$html .= $item . ' ' . $row[$k] . '<br />';
}


}

echo $html; // or whatever

与回复中显示的其他想法一起使用。

答案 2 :(得分:0)

答案 3 :(得分:0)

使用此代码:

$tpl = "<html><body>";
for($i=1;$i<500;$i++)
{
    if(isset($database['item'.$i]))
    {
    $tpl = $tpl.'<span class="item">Description for item '.$i.':</span><span class="content">{item'.$i.'}</span>';
    }
}    
$tpl = $tpl."</body></html>";

echo str_replace( 
array('{item1}','{item2}','{item3}') ) , 
array($database['item1'],$database['item2'],$database['item3']) , 
$tpl );

答案 4 :(得分:0)

我实际上建议在db

上使用foreach循环
$tpl = '';
foreach($database as $itemName => $value)
{
$tpl .= '<span class="item">Description for item '.$i.':</span><span class="content">{item'.$i.'}</span>';
}

可能需要适应它,否则应该是好的