ugrás a tartalomhoz

Template rendszer preg_replace

DsA · 2010. Már. 3. (Sze), 22.50
Hali!
Írtam egy saját template motort. amiben így müködnek a változók, tömbök:
{valtozo}
{tomb:index}

ezt szeretném kibővíteni hogy lehessen if-et is meg pl függvényt is meghívni benne.
gondolkoztam, hogy milyen szintaktikával kéne egyáltalán használni. gondoltam olyat, hogy esetleg így:
{:date("Y-m-d"):}

az if-et meg így:
{:if($a>$b):}
akármi
{:endif:}

de igazábol nemtudom még, hogy hogy lenne jó pl az if után kelljen-e kapcsos zárójel vagy az if-ben a változoknál dollárjel kelljen-e vagy csak úgy csináljam mintha a template rendszerbe írnám a változót: {változó} .
tehát pl:
{:if({a}>{b}):}
akármi
{:endif:}

tehát nem tudom. egyik kérdésem az lenne, hogy szerintetek milyen szintaktikát kéne követnem?

valamint, hogy kéne ezt preg_replace-el lecserélnem?
mert elég necces mintát kéne írná rá pl a függvény meghívásra:
ugye hogy illeszkedjen erre is:
{:date("Y-m-d"):}

meg erre is:
{:fuggvenynev($valtozo):}

( valamint itt is h kelljen-e a dollárjel vagy itt is csak a kapcsoszárojelet használjam a változónál )
meg erre is:
{:fuggvenynev($valtozo,$valtozo_2,"asd",$valtozo_3,true):}

meg h annyi paramétert lehessen megadni amennyit csak akarok szal elég nehéz szerintem.
erre a variációra, hogy {:date("Y-m-d"):} erre tegnap elkezdtem írni egy mintát:
/\{\:(.*?)\:}/e

már nincs meg és nemis emlékszem rá de valami ilyesmi volt de mindig hibát dobott. hogy failed evulating code vagy vmi ilyesmit. gugliztam utána és írtak egy pár féle dolgot de sajnos úgy ahogy nekem van írva a motorom ahoz egyik sem stimmel.
így néz ki az ide vágó kód:
function replaceVariables($tag,$buffer_content="") {
  $content = ( ( $buffer_content!="" )?$buffer_content:$this->content );
  if (preg_match("/<block:{$tag}>(.*?)<\/block:{$tag}>/is",$content,$out)) {
    if (count($this->PreVars)>0) {
      foreach($this->PreVars as $key => $value) {
        if (strpos($out[1],$key)!==false) {
          $out[1] = str_replace("{".$key."}",$value,$out[1]);
        }
      }
    }
    return @preg_replace(array('/\{([a-zA-Z0-9_]+)\}/e','/\{([a-zA-Z0-9_]+):([a-zA-Z0-9_]+)\}/e'),array('$GLOBALS["\\1"]','$GLOBALS["\\1"]["\\2"]'),$out[1]);
  } else {
    $this->errorLog("Error: no tag found ({$tag}) ! Time: ".date("Y-m-d H:i:s").", File: ".$_SERVER["PHP_SELF"]."?".$_SERVER["QUERY_STRING"]);
    die();
  }
}

és ide kéne a preg_replace tömbjeibe valamit beleírni. ami még függ a szintaktikától is. ebben szeretném a segítségeteket kérni hogy hogy legyen, mint legyen.

Köszönöm előre is!
 
1

Template rendszer

oszi330 · 2010. Már. 4. (Cs), 11.08
Szia!

Általában a template rendszerek úgy működnek, hogy a template nyelvet átfordítják php nyelvre, majd ezt a php kódot elmentik egy cache-be, hogyha újra használod, akkor nem kell újra átforditani, hanem a cacheből kiolvasott kódot kell includeolni, vagy a PHP eval() függvényével végrehajtani a belőle kiolvasott kódot.

Az átfordítás úgy működik, fogy a templét nyelved elemeit preg_replace-szel mintánként kicseréled php kódra. Persze ha valami nem illeszkedik a mintára és benne marad, akkor hibaüzenetekből tudod megtalálni.

A cache úgy működik, hogy a már lefordított php stringet kimented egy cache könyvtárba, a cache filenevet úgy kell megválasztani vagy színezni, hogy ha két ugyanolyan nevű, de más útvonalú templét file-t fordítottál, akkor se keveredjenek össze.
Hogy lekezeld azt, hogy frissült később a templét fájl, ahhoz a cache-ben lévő fájl létrehozási idejét és a templét fájl létrehozási idejét össze kell vetni. Ha a templét fájl frisseb, akkor le kell cserélni a cache file-t.

A kiírásnál szerintem beszédesebb a
{$a}
{$tömb:elem}

mert jobban látszik, hogy változót akarsz kiiratni.
Itt könnyen megoldahatod a htmlspecialcharst is
$code = preg_replace("/\\{$(\w)+\\}/", "<?php echo htmlspecialchars($\\1, ENT_QUOTES, 'utf-8'); ?>", $code)
$code = preg_replace("/\\{$(\w)+:(\w)+\\}/", "<?php echo htmlspecialchars($\\1[\\2], ENT_QUOTES, 'utf-8'); ?>", $code)
Ha html kódot írsz ki, akkor be lehet vezetni új elemeket
{:html $a}
{:html $tömb:elem}


Az if-nél
{:if $a > $b:}
$code = preg_replace("/\\{\\:if(.*?)\\:\\}/", "<?php if(\\1): ?>", $code)
endif:
{:endif:}
$code = preg_replace("/\\{\\:endif\\:\\}/", "<?php :endif; ?>", $code)
függvényhívásra, vagy bármilyen php kódra:
{:php valamifüggvény($x) :}
$code = preg_replace("/\\{\\:php(.*?)\\:\\}/", "<?php \\1 ?>", $code)
A templét nyelvet tovább lehet bővíteni, ha újabb preg_replace-ket teszel bele.