2012-10-19 90 views
0

我有一个阵列数据PHP str_replace函数模板

$data = array(title=>'some title', date=>1350498600, story=>'Some story'); 

我有一个模板

$template = "#title#, <br>#date(d)#<br> #date(m)#<br>#date(Y)#<br> #story#"; 

我想要的是,以适应数据导入模板,我知道可以通过str_replace函数来完成但我的问题是日期格式。日期格式来自模板而非数据,数据日期中存储为php日期。 昨天我试着问同样的问题,但我认为我的问题并不清楚。 有人请帮助我。

+0

这会让你的模板引擎变慢。如果我是你,我会拥有一个简单的替代模板引擎。 –

+0

谢谢你的回答。你的建议呢? – alladeen

回答

1

我认为它不会与str_replace函数轻松地工作所以我要使用preg_replace

$data = array('title'=>'some title', 'date'=>1350498600, 'story'=>'Some story'); 
$template = "#title#, <br>#date(d)#<br> #date(m)#<br>#date(Y)#<br> #story#"; 
$result = preg_replace_callback('/#(\w+)(?:\\((.*?)\\))?#/', function ($match) use($data) { 
    $value = isset($data[$match[1]]) ? $data[$match[1]] : null; 

    if (!$value) { 
     // undefined variable in template throw exception or something ... 
    } 

    if (! empty($match[2]) && $match[1] == "date") { 
     $value = date($match[2], $value); 
    } 

    return $value; 
}, $template); 

而不是使用date(m)date(Y)你也可以做这样的事情 date(d-m-Y)使用这个片段

这样做的缺点是,你可以只格式化使用这种机制的date变量。但通过一些调整,您可以扩展此功能。


注:如果使用低于5.3 PHP版本不能使用封闭,但你可以做到以下几点:

function replace_callback_variables($match) { 
    global $data; // this is ugly 

    // same code as above: 

    $value = isset($data[$match[1]]) ? $data[$match[1]] : null; 

    if (!$value) { 
     // undefined variable in template throw exception or something ... 
    } 

    if (! empty($match[2]) && $match[1] == "date") { 
     $value = date($match[2], $value); 
    } 
    return $value; 
} 

$data = array('title'=>'some title', 'date'=>1350498600, 'story'=>'Some story'); 
$template = "#title#, <br>#date(d)#<br> #date(m)#<br>#date(Y)#<br> #story#"; 
// pass the function name as string to preg_replace_callback 
$result = preg_replace_callback('/#(\w+)(?:\\((.*?)\\))?#/', 'replace_callback_variables', $template); 

可以在PHP here

找到有关回调的详细信息
+0

解析错误:在第10行解析错误,并让我告诉你在模板中的日期格式不固定,如我前面提到的。它可能只是#date(DMY)#代替#date(d)#,#日期(M)#,#日期(Y)# – alladeen

+0

@Mogria它有错误......但+1不错的尝试 – Baba

+0

我固定!错误 – MarcDefiant

0

下载此文件:http://www.imleeds.com/template.class.txt

将扩展名重命名为.TXT

这是我多年前创建的东西,我始终将我的HTML远离我的PHP。所以看下面的例子。

<?php 

include("template.class.php"); 

//Initialise the template class. 
$tmpl = new template; 

$name = "Richard"; 
$person = array("Name" => "Richard", "Domain" => "imleeds.com"); 

/* 
On index.html, you can now use: %var.name|Default if not found% and also, extend further, %var.person.Name|Default% 
*/ 

//Output the HTML. 
echo $tmpl->run(file_get_contents("html/index.html")); 

?> 
+0

我不想过度复杂我的答案,但也可以使用函数以及提供参数,例如:%function.date | jS F Y% –