Autor | Zpráva | ||
---|---|---|---|
Jordan Profil * |
#1 · Zasláno: 29. 11. 2013, 18:48:55 · Upravil/a: Jordan
Hezký dobrý večer, potřebuju vysvětlit popřípadě opravit regulární výraz
Dělal jsem si vlastní template system a "tagy" v template se mi nevyhodnocují správně pokud jsou na stejném řádku regulár jsem zkoušel na http://preg_replace.onlinephpfunctions.com/ kde fungoval spravne ale v pokud ho použuju ve skriptu tak ten replace proběhne špatně v sablone: <img src="{$i->i_title}" alt="{$i->i_title}" />
vyraz: #{(.*?)}#
očekávaný výsledek: <img src="<?php echo $i->i_title; ?>" alt="<?php echo $i->i_title; ?>" />
a reálný (špatný): <img src="<?php $i->i_title}" alt="{$i->i_title; ?>" />
Třída class Template { /** @var string */ private $template; /** @var string */ private $toRender; public function loadTpl($template = null) { //@todo adresa sablon v configu $this->template = file_get_contents(_indexroot . 'plugins/extend/advertising/templates/' . $template); $this->replace(); file_put_contents(_indexroot . 'plugins/extend/advertising/templates/default/category.php', $this->toRender); } public function replace() { $tag = require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.php'; $toRender = $this->template; foreach ($tag as $key => $val) { $toRender = preg_replace($key, $val, $toRender, -1); } $this->toRender = $toRender; } public function render($obj) { $object = array('obj' => $obj); ob_start(); extract($object, EXTR_SKIP); include _indexroot . 'plugins/extend/advertising/templates/default/category.php'; return ob_get_clean(); } } category.tpl <div class="module-category template-{$obj->template}"> <h1>{$obj->title}</h1> <a href="{$obj->parent}" class="backlink">< návrat zpět</a> <div class="category-description"> </div> <div class="category-filter"> <div class="category-filter-type"> </div> <div class="category-filter-region"> </div> <div class="category-filter-price"> </div> <div class="category-view"> </div> </div> <div class="category-list"> {foreach $obj->items as $i} <div class="item"> <div class="item-title"> <a href="{$i->i_fullpath}"><h2>{$i->i_title}</h2></a> </div> <div class="item-img"> <a href="#"> <img src="{$i->i_photo}" alt="{$i->i_title}" /> </a> </div> <div class="item-description"> <p>{$i->i_description}</p> </div> <div class="item-price"> </div> <div class="item-editor-link"> </div> </div> {/foreach} </div> <div class="category-paging-paging"> </div> </div> config.php (asociativni pole "tagu") < <?php return array( // foreach '#{foreach c:(.*) as (.*)}#' => '<?php foreach(\$obj->$1 as $2): ?>', '#{foreach (.*) as (.*)}#' => '<?php foreach($1 as $2): ?>', '#{foreach (.*) as (.*) => (.*)}#' => '<?php foreach($1 as $2 => $3): ?>', '#{/foreach}#' => '<?php endforeach; ?>', // if '#{if (.*)}#' => '<?php if($1): ?>', '#{elseif (.*)}#' => '<?php elseif($1): ?>', '#{else}#' => '<?php else: ?>', '#{/if}#' => '<?php endif; ?>', // while '#{while (.*)}#' => '<?php while($1): ?>', '#{/while}#' => '<?php endwhile; ?>', // for '#{for (.*)}#' => '<?php for ($1): ?>', '#{/for}#' => '<?php endfor; ?>', '#{break}#' => '<?php break; ?>', '#{break ([0-9]+)}#' => '<?php break $1; ?>', '#{continue}#' => '<?php continue; ?>', '#{continue ([0-9]+)}#' => '<?php continue $1; ?>', // switch '#{switch (.*)}#' => '<?php switch($1): ?>', '#{case (.*)}#' => '<?php case $1: ?>', '#{default}#' => '<?php default: ?>', '#{/switch}#' => '<?php endswitch; ?>', //include '#{include (.*)}#' => '<?php include(\'$1\'); ?>', '#{include_once (.*)}#' => '<?php include_once(\'$1\'); ?>', //operators '#{(.*)\+\+}#' => '<?php $1++; ?>', '#{(.*)--}#' => '<?php $1--; ?>', '#{(.*)=(.*)}#' => '<?php $1=$2; ?>', '#{(.*?)}#' => '<?php echo $1; ?>', ); nahoře došlo k záměně $i->i_title a $i_photo jinak na problemu to nic nemeni |
||
Tori Profil |
#2 · Zasláno: 29. 11. 2013, 19:49:36
Tohle celé:
{$i->i_title}" alt="{$i->i_title} odpovídá předposlednímu reguláru, #{(.*)=(.*)}# .
Pomohlo by změnit RE na více restriktivní, např. #{([^{}]*)=([^{}]*)}# .
|
||
Jordan Profil * |
#3 · Zasláno: 29. 11. 2013, 21:08:05
vskutku, bylo to tím. děkuji za pomoc
|
||
Časová prodleva: 10 let
|
0