0

データ用の配列が1つあります

    $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日付として保存されます。昨日、同じ質問をしようとしましたが、私の質問が明確ではなかったと思います。誰でも私を助けてください。

4

3 に答える 3

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 でのコールバックの詳細については、こちらを参照してください。

于 2012-10-19T11:54:52.400 に答える
0

次のようなテンプレートエンジンを使用することをお勧めします: https ://github.com/cybershade/CSCMS/blob/master/core/classes/class.template.php

そして、テンプレートは次のようになります: https ://github.com/cybershade/CSCMS/blob/master/themes/cybershade/site_header.tpl および https://github.com/cybershade/CSCMS/blob/master/modules /forum/views/viewIndex/default.tpl

于 2012-10-19T11:53:19.353 に答える
0

このファイルをダウンロードしてください: http://www.imleeds.com/template.class.txt

拡張子の名前を .TXT から .PHP に変更します

これは私が何年も前に作成したもので、常に 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"));

?>
于 2012-10-19T12:07:24.583 に答える