2012-10-19 72 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% –