Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Алгоритм нужно пропарсить вложенные структуры

Сообщения:  [1-10]   [11-20] 

 
 автор: psychomc   (18.11.2010 в 21:51)   письмо автору
 
   для: Красная_шляпа   (18.11.2010 в 20:51)
 

универсальность нужна в первую очередь... и кстати циклов тоже желательно несколько (подобие foreach и подобие for (т.е section - очень удобно, когда нужно вывести данные в столбец, например в левом четные, в правом нечетные). и еще кстати, хорошо если передача параметров в итоге будет простой (я например делал для всего $tpl->param("name", $value), так же и массивы. у вас как-то очень сложно. как уже писал, лучше всего наверное отказаться от этой идеи и полностью использовать возможности интерпретатора... а вообще конечно ваше дело. опять же, я так считаю потому что уже сталкивался с этим вопросом и тоже много времени потратил на выбор решения.

p.s может быть не в тему написал и не то что вы ожидали. просто имхо, кажется что вы все-таки пошли не в том направлении. в код лезть совсем не хочется

  Ответить  
 
 автор: Красная_шляпа   (18.11.2010 в 20:51)   письмо автору
 
   для: psychomc   (18.11.2010 в 20:33)
 



<?php

/**
* Название (имя) класса
*
* Полное описание
*
* @author Ф.И.О. <e-mail>
* @version 1.0
*/

class Template {
    public 
$vars = array();
    public 
$list = array();
    private 
$content;
    private 
$samples = array();

    public function  
__construct($filename) {
        
$content file_get_contents($filename);
        
$this->content $content;
        
$this->getSamples($content);
        
// print_r($this->samples);
    
}

    public function 
parse() {
        
$tree = array();
        
$this->parseList($this->list$tree);

        
print_r($tree);

        
$this->content $this->Cut($this->content);
        
$replacements $this->getVars($this->content);
        
$this->content $this->assignVars($this->content$this->vars$replacements);
    }

    public function 
P(&$tree) {
        foreach (
$tree as $k => $v) {
            if (isset(
$tree["childs"])) {
                
//
            
}
        }
    }



    public function  
__toString() {
        return 
$this->content;
    }

    public function 
asString() {
        return 
$this->__toString();
    }

    
/**
    * метод assignVars - подставляет значения в шаблон
    *
    * @param строка $content
    * @param ассоциативный массив $vars
    * @param массив $replacements
    * @return строка
    */
    
    
private function assignVars($content$vars$replacements = array()) {
        if (!empty(
$vars) and is_array($vars)) {
            foreach (
$vars as $k => $v) {
                
$content str_replace("{{\$$k}}"$v$content);
            }
        }
        if (!empty(
$replacements) and is_array($replacements)) {
            foreach (
$replacements as $v) {
                
$content str_replace($v""$content);
            }
        }
        return 
$content;
    }

    private function 
parseList(&$list, &$tree) {
        foreach (
$list as $k => $v) {
            
$count count($v);
            for (
$i 0$i $count; ++$i) {
                
$tree[$k][$i]["data"] = $this->assignVars($this->samples[$k][1], $v[$i]->vars$this->getVars($this->samples[$k][1]));
                if (isset(
$v[$i]->list)) {
                    
$this->parseList($v[$i]->list$tree[$k][$i]["childs"]);
                }
            }         
        }
    }

    private function 
Cut($content) {
        
$pattern "/\{\{\@([_a-z][_a-z\d]*)\}\}(.*?)\{\{\\1;\}\}/uis";
        
$content preg_replace($pattern""$content);
        return 
$content;
    }

    private function 
getVars($content) {
        
$content $this->Cut($content);
        
$matches = array();
        
preg_match_all("/\{\{\\$[_a-z][_a-z\d]*\}\}/ui"$content$matches); // \$ -> \\$
        
return $matches[0];
    }

    private function 
getSamples($content) {
        
$pattern "/\{\{\@([_a-z][_a-z\d]*)\}\}(.*?)\{\{\\1;\}\}/uis";
        
$matches = array();
        
preg_match_all($pattern$content$matches);
        if (!empty(
$matches[0])) {
            
$count count($matches[0]);
            for (
$i 0$i $count; ++$i) {
                
$this->samples[$matches[1][$i]] = array($matches[0][$i], $matches[2][$i]);
                
$this->getSamples($matches[2][$i]);
            }
        }
    }

}


?>

<?php

error_reporting
(E_ALL);

require 
"Template.class.php";
$tpl = new Template("content.html");
$tpl->vars["Title"] = "Тест";
$tpl->vars["Entry"] = "lorem inspum dollor east inspum 
loram inspum east dollor as lorem inem inspum dollor east 
inspum loram inspum east dollor as lorem inspum dollor east 
inspum loram inspum east dollor as lorem inspum dollor east 
inspum loram inspum east dollor as lorem inspum dollor east 
inspum loram inspum east dollor as lorem inspum dollor east 
inspum loramem inspum dollor east inspum loram inspum east 
dollor as lorem inspum dollor east inspum loram inspum east 
dollor

s lorem inspum dollor east inspum loram inspum east dollor 
as lorem inspum dollor east inspum loram inspum east dollor 
as lorem inspum dollor east inspum loramem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
easast inspum loram inspum east dollor as lorem inspum 
dollor east inspum loram inspum east dollor as lorem inspum 
dollor east inspum lo

ramem inspum dollor east inspum loram inspum east dollor as 
lorem inspum dollor east inspum loram inspum east dollor as 
lorem inspum dollor east inspum loram inspum east dollor as 
lorem inspum dollor east inspum loram inspum east dollor as 
lorem inspum dollor easast inspum loram inspum east dollor 
as lorem inspum dollor east inspum loram inspum east dollor 
as lorem inspum dollor east inspum loramem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loram inspum east dollor as lorem inspum dollor 
east inspum loramem inspum dollor east inspum loram inspum 
east dollor as lorem inspum dollor east inspum loram inspum 
east dollor as lorem inspum dollor east inspum loram inspum 
east dollor as lorem inspum dollor east inspum loram inspum 
east dollor as lorem inspum dollor east inspum loram"
;

$tpl->list["Categories"][0]->vars["Category"] = "Сотовые телефоны";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "Nokia";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "SE";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "LG";
$tpl->list["Categories"][0]->list["Articles"][]->vars["Article"] = "Samsung";

$tpl->list["Categories"][1]->vars["Category"] = "Сантехника";
$tpl->list["Categories"][1]->list["Articles"][]->vars["Article"] = "Ванны";
$tpl->list["Categories"][1]->list["Articles"][]->vars["Article"] = "Унитазы";

$tpl->list["Employees"][]->vars = array("Name" => "Иван","Post" => "Программист",);
$tpl->list["Employees"][]->vars = array("Name" => "Сергей","Post" => "генеральный директор",);
$tpl->list["Employees"][]->vars = array("Name" => "Мария","Post" => "Менеджер",);

echo 
"<pre>";
// print_r($tpl->list);

$tpl->parse();
// echo $tpl;

?>



Не въебу как быть с вложенными циклами... мозгами понимаю что больше двух вложенных циклов на странице не нужно, можно ограничется этим числом, но хочется универсальности

  Ответить  
 
 автор: psychomc   (18.11.2010 в 20:33)   письмо автору
 
   для: Красная_шляпа   (18.11.2010 в 19:04)
 

хм. разделители грамотно. а вот синтаксис имхо. я у себя например делал синтаксис похожий на смарти...

  Ответить  
 
 автор: Красная_шляпа   (18.11.2010 в 19:04)   письмо автору
 
   для: Красная_шляпа   (16.11.2010 в 22:23)
 



{{include header.html}}
        <h1>{{$Title}}</h1>
        <div>{{$Entry}}</div>
        <h2>Навигация:</h2>
        {{@Categories}}
        <h3><a href="#">{{$Category}}</a></h3>
        <ul>
            {{@Articles}}
            <li><a href="#">{{$Article}}</a></li>
            {{Articles;}}
        </ul>
        {{Categories;}}
        <h2>Список сотрудников:</h2>
        <table border="1" cellpadding="2" cellspacing="0">
            <tr><th>Имя</th><th>Должность</th></tr>
            {{@Employees}}
                <tr><td>{{$Name}}</td><td>{{$Post}}</td></tr>
            {{Employees;}}
        </table>
{{include footer.html}}



пока такая разметка шаблонов

  Ответить  
 
 автор: Красная_шляпа   (17.11.2010 в 13:56)   письмо автору
 
   для: psychomc   (17.11.2010 в 13:47)
 

Что-то не пойму...



<?php

error_reporting
(E_ALL);

$Tree = array();
$Tree["L1"][0]["vars"]["Heading"] = "Работа";
$Tree["L1"][1]["vars"]["Heading"] = "Недвижимость";
$Tree["L1"][0]["childs"] = array("L2" => array(array("vars" => array("Item" => "Резюме"), "childs" => array(),)));
$Tree["L1"][0]["childs"]["L2"][1] = array("vars" => array("Item" => "Вакансии"), "childs" => array(),);
$Tree["L1"][1]["childs"] = array("L2" => array(array("vars" => array("Item" => "Жильё"), "childs" => array(),)));
$Tree["L1"][1]["childs"]["L2"][] = array("vars" =>  array("Item" => "Коммерческая"), "childs" => array(),);
$Tree["L1"][1]["childs"]["L2"][] = array("vars" =>  array("Item" => "Производство"), "childs" => array(),);
$Tree["L1"][1]["childs"]["L2"][] = array("vars" =>  array("Item" => "Прочая нежилая"), "childs" => array(),);

// echo "<pre>";
// print_r($Tree);
// echo "</pre>";

class Loop {
    public 
$vars = array();
    public 
$childs = array();
    
    public function  
__construct($Array) {
        
$this->vars $Array["vars"];
        
$this->childs $Array["childs"];
    }
}

class 
Test {
    public 
$loop = array();

    function  
__construct() {
        global 
$Tree;
        foreach (
$Tree as $k => $v) {
            foreach (
$v as $vv) {
                
$this->loop[$k][] = new Loop(&$vv);
            }
        }
    }

}

$test = new Test();
echo 
"<pre>";
print_r($test->loop["L1"][0]->vars);

?>

  Ответить  
 
 автор: psychomc   (17.11.2010 в 13:47)   письмо автору
 
   для: Красная_шляпа   (17.11.2010 в 13:45)
 

а вообще как хотите. я изначально подходил к этому вопросу так же как вы, но потом отказался т.к было очень много головной боли с разбором

  Ответить  
 
 автор: psychomc   (17.11.2010 в 13:46)   письмо автору
 
   для: Красная_шляпа   (17.11.2010 в 13:45)
 

а если опция кэширования будет отключаться? я думаю не стоит каждый раз разбирать заново шаблон если он не изменялся

  Ответить  
 
 автор: Красная_шляпа   (17.11.2010 в 13:45)   письмо автору
 
   для: psychomc   (17.11.2010 в 13:44)
 

в моём случае компиляция в пхп бесполезна

  Ответить  
 
 автор: psychomc   (17.11.2010 в 13:44)   письмо автору
 
   для: Красная_шляпа   (17.11.2010 в 13:31)
 

одно другому не мешает

  Ответить  
 
 автор: Красная_шляпа   (17.11.2010 в 13:31)   письмо автору
 
   для: psychomc   (17.11.2010 в 13:23)
 

в моём случае будет кэширование

  Ответить  

Сообщения:  [1-10]   [11-20] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования