Autor Zpráva
Jordan
Profil *
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">&lt; 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
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 *
vskutku, bylo to tím. děkuji za pomoc

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0