在 PHP 中有更好的方法来做动态模板

我正在为一个应用程序创建模块,该模块将具有简单的自定义模板,带有标签,这些标签将被数据库中的数据替换。此模块的每个实例中的字段名称都不同。我想知道是否有更好的方法来做到这一点。


下面的代码是我想出来的,但我相信一定有更好的方法。我在 preg_split 和 preg_match_all 上挣扎,刚刚达到我的极限,所以我以愚蠢的方式做到了。


<?php


$customTemplate = "

<div>

    <<This>>

    <<that>>

</div>

";


function process_template ($template, $begin = '<<', $end = '>>') {

    $begin_exploded = explode($begin, $template);

    if (is_array($begin_exploded)) {

        foreach ($begin_exploded as $key1 => $value1) {

            $end_exploded = explode($end, $value1);


            if (is_array($end_exploded)) {

                foreach ($end_exploded as $key2 => $value2) {

                    $tag = $begin.$value2.$end;

                    $variable = trim($value2);


                    $find_it = strpos($template,$tag);

                    if ($find_it !== false) {

                        //str_replace ($tag, $MyClass->get($variable), $template );

                        $template = str_replace ($tag, $variable, $template);

                    }

                }

            }

        }

    }

    return $template;

}



echo(process_template($customTemplate));


/* Will Echo 


<div>

    This

    that

</div>


*/

?>

将来我将连接 $MyClass->get() 用正确的数据替换标签。自定义模板将由用户构建。


繁星淼淼
浏览 163回答 2
2回答

千巷猫影

而不是preg_splitorpreg_match我宁愿使用preg_replace_callback,因为您正在进行替换,并且替换值源自看起来最终将成为另一个类中的方法的内容。function process_template($template, $begin = '<<', $end = '>>') {&nbsp; &nbsp; // get $MyClass in the function scope somehow. Maybe pass it as another parameter?&nbsp; &nbsp; return preg_replace_callback("/$begin(\w+)$end/", function($var) use ($MyClass) {&nbsp; &nbsp; &nbsp; &nbsp; return $MyClass->get($var[1]);&nbsp; &nbsp; }, $template);}这是一个可以玩的例子:https : //3v4l.org/N1p03我认为这只是为了好玩/学习。如果我真的需要使用模板来做某事,我宁愿从头开始composer require "twig/twig:^2.0"。事实上,如果你有兴趣了解更多关于它是如何工作的,你可以去看看一个完善的系统,比如树枝或刀片。(比我在这个答案中所做的要好。)

慕娘9325324

周围有大量的模板引擎,但有时......只是为一个可能简单的事情增加复杂性和依赖性。这是我用于进行一些 javascript 更正的修改示例。这适用于您的模板。function process_template($html,$b='<<',$e='>>'){&nbsp; &nbsp; $replace=['this'=>'<input name="this" />','that'=>'<input name="that" />'];&nbsp; &nbsp; if(preg_match_all('/('.$b.')(.*?)('.$e.')/is',$html,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE)){&nbsp; &nbsp; &nbsp; $t='';$o=0;&nbsp; &nbsp; &nbsp; foreach($matches as $m){&nbsp; &nbsp; &nbsp; &nbsp; //for reference $m[1][0] contains $b, $m[2][0] contains $e&nbsp; &nbsp; &nbsp; &nbsp; $t.=substr($html,$o,$m[0][1]-$o);&nbsp; &nbsp; &nbsp; &nbsp; $t.=$replace[$m[2][0]];&nbsp; &nbsp; &nbsp; &nbsp; $o=$m[3][1]+strlen($m[3][0]);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; $t.=substr($html,$o);&nbsp; &nbsp; &nbsp; $html=$t;&nbsp; &nbsp; }&nbsp; &nbsp; return $html;}$html="<div>&nbsp; &nbsp; <<this>>&nbsp; &nbsp; <<that>></div>";$new=process_template($html);echo $new;出于演示目的,我放置了$replace处理替换的数组。您可以使用将处理替换的函数替换它们。这是一个工作片段:https : //3v4l.org/MBnbR我喜欢这个功能,因为你可以控制替换什么以及在最终结果上放什么。顺便说一下,通过在PREG_OFFSET_CAPTURE匹配上使用也返回正则表达式组发生的位置。那些在$m[x][1]. 捕获的文本将在 上$m[x][0]。
打开App,查看更多内容
随时随地看视频慕课网APP