第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

在 PHP 中有更好的方法來做動態(tài)模板

在 PHP 中有更好的方法來做動態(tài)模板

PHP
繁星淼淼 2021-11-05 16:22:45
我正在為一個(gè)應(yīng)用程序創(chuàng)建模塊,該模塊將具有簡單的自定義模板,帶有標(biāo)簽,這些標(biāo)簽將被數(shù)據(jù)庫中的數(shù)據(jù)替換。此模塊的每個(gè)實(shí)例中的字段名稱都不同。我想知道是否有更好的方法來做到這一點(diǎn)。下面的代碼是我想出來的,但我相信一定有更好的方法。我在 preg_split 和 preg_match_all 上掙扎,剛剛達(dá)到我的極限,所以我以愚蠢的方式做到了。<?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() 用正確的數(shù)據(jù)替換標(biāo)簽。自定義模板將由用戶構(gòu)建。
查看完整描述

2 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

而不是preg_splitorpreg_match我寧愿使用preg_replace_callback,因?yàn)槟谶M(jìn)行替換,并且替換值源自看起來最終將成為另一個(gè)類中的方法的內(nèi)容。


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

    // get $MyClass in the function scope somehow. Maybe pass it as another parameter?

    return preg_replace_callback("/$begin(\w+)$end/", function($var) use ($MyClass) {

        return $MyClass->get($var[1]);

    }, $template);

}

這是一個(gè)可以玩的例子:https : //3v4l.org/N1p03


我認(rèn)為這只是為了好玩/學(xué)習(xí)。如果我真的需要使用模板來做某事,我寧愿從頭開始composer require "twig/twig:^2.0"。事實(shí)上,如果你有興趣了解更多關(guān)于它是如何工作的,你可以去看看一個(gè)完善的系統(tǒng),比如樹枝或刀片。(比我在這個(gè)答案中所做的要好。)


查看完整回答
反對 回復(fù) 2021-11-05
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

周圍有大量的模板引擎,但有時(shí)......只是為一個(gè)可能簡單的事情增加復(fù)雜性和依賴性。這是我用于進(jìn)行一些 javascript 更正的修改示例。這適用于您的模板。


function process_template($html,$b='<<',$e='>>'){

    $replace=['this'=>'<input name="this" />','that'=>'<input name="that" />'];

    if(preg_match_all('/('.$b.')(.*?)('.$e.')/is',$html,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE)){

      $t='';$o=0;

      foreach($matches as $m){

        //for reference $m[1][0] contains $b, $m[2][0] contains $e

        $t.=substr($html,$o,$m[0][1]-$o);

        $t.=$replace[$m[2][0]];

        $o=$m[3][1]+strlen($m[3][0]);

      }

      $t.=substr($html,$o);

      $html=$t;

    }

    return $html;

}

$html="

<div>

    <<this>>

    <<that>>

</div>

";

$new=process_template($html);

echo $new;

出于演示目的,我放置了$replace處理替換的數(shù)組。您可以使用將處理替換的函數(shù)替換它們。


這是一個(gè)工作片段:https : //3v4l.org/MBnbR


我喜歡這個(gè)功能,因?yàn)槟憧梢钥刂铺鎿Q什么以及在最終結(jié)果上放什么。順便說一下,通過在PREG_OFFSET_CAPTURE匹配上使用也返回正則表達(dá)式組發(fā)生的位置。那些在$m[x][1]. 捕獲的文本將在 上$m[x][0]。


查看完整回答
反對 回復(fù) 2021-11-05
  • 2 回答
  • 0 關(guān)注
  • 194 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號