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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Алгоритм нужно пропарсить вложенные структуры
 
 автор: Красная_шляпа   (16.11.2010 в 22:23)   письмо автору
 
 

Типа такого



 {{loop id=0}}
    <div>
    {{var1}}
    {{loop id=1}}
        <div>
        {{var2}}
        </div>
    {{loop;}}
    </div>
{{loop;}}




Пока только так

tables.htm


<table border="1" cellspacing="0" cellpadding="4">
        <tr><th>Имя</th><th>Возраст</th></tr>
        {{loop id=0}}<tr><td>{{name}}</td><td>{{age}}</td></tr>{{loop;}}
    </table>

    <br><br>

    <table border="1" cellspacing="0" cellpadding="4">
        <tr><th>Имя</th><th>Должность</th></tr>
        {{loop id=1}}<tr><td>{{name}}</td><td>{{post}}</td></tr>{{loop;}}
    </table>


page.htm


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>{{Title}}</title>
    </head>
    <body>
        {{Content}}
    </body>
</html>


test.php


<?php

define
("RootPath"str_replace("\\""/"dirname($_SERVER["PHP_SELF"])));
define("AbsolutePath"str_replace("\\""/"realpath(".")));
require 
AbsolutePath."/system/config.php";
require 
AbsolutePath."/system/consts.php";
require 
AbsolutePath."/system/vars.php";
require 
AbsolutePath."/system/functions.php";
date_default_timezone_set($timezone);

function 
__autoload($ClassName) {
    require 
AbsolutePath."/system/classes/$ClassName.class.php";
}

$tpl = new Template("tables.htm");
$tpl->Loop(0)->vars[0]["name"] = "Иван";
$tpl->Loop(0)->vars[0]["age"] = "18";
$tpl->Loop(0)->vars[1]["name"] = "Мария";
$tpl->Loop(0)->vars[1]["age"] = "17";
$tpl->Loop(0)->vars[2]["name"] = "Сергей";
$tpl->Loop(0)->vars[2]["age"] = "22";
$tpl->Loop(1)->vars[0] = array("name" => "Иван""post" => "Программист");
$tpl->Loop(1)->vars[1] = array("name" => "Мария""post" => "Менеджер");
$tpl->Loop(1)->vars[2] = array("name" => "Сергей""post" => "Генеральный директор");
$tpl->parse();
$content $tpl->asString();
$tpl = new Template("page.htm");
$tpl->vars["Title"] = "Тест";
$tpl->vars["Content"] = $content;
$tpl->parse();
echo 
$tpl;



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Тест</title>
    </head>
    <body>
        
    <table border="1" cellspacing="0" cellpadding="4">
        <tr><th>Имя</th><th>Возраст</th></tr>
        <tr><td>Иван</td><td>18</td></tr><tr><td>Мария</td><td>17</td></tr><tr><td>Сергей</td><td>22</td></tr>
    </table>

    <br><br>

    <table border="1" cellspacing="0" cellpadding="4">
        <tr><th>Имя</th><th>Должность</th></tr>
        <tr><td>Иван</td><td>Программист</td></tr><tr><td>Мария</td><td>Менеджер</td></tr><tr><td>Сергей</td><td>Генеральный директор</td></tr>
    </table>

    </body>
</html>

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

чем не устраивает просто замена
{{loop .. на <?php for...
и т.п?

  Ответить  
 
 автор: Красная_шляпа   (16.11.2010 в 22:43)   письмо автору
 
   для: psychomc   (16.11.2010 в 22:41)
 

eval и буферизация, я сначала так хотел, но потом передумал.

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

видно я давно перерос этот форум ни на один вопрос я тут ещё ни разу ответа не получил...

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

http://www.php.ru/forum/viewforum.php?f=27 о форум php.ru это что-то один долбоёб хвалится другому что однажды в жизни мини-форум написал... мастер-класс по созданию гостевой книги, рекурсивный обход каталога... что за хуйня? сегодня был в банке снимал деньги и пока ждал когда перевод оформят, открыл журнал(не помню название) и там неутешительные данные по IT в России были что наша страна производит 0.2-0.5% софта в мире, а США 37%...

  Ответить  
 
 автор: grafen   (17.11.2010 в 07:56)   письмо автору
 
   для: Красная_шляпа   (16.11.2010 в 23:17)
 

И среди 37% треть русских трудится))

  Ответить  
 
 автор: psychomc   (17.11.2010 в 10:09)   письмо автору
 
   для: grafen   (17.11.2010 в 07:56)
 

думаю вряд ли

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

хм...ни то ни другое. делаете замену -> сохраняете файл -> подключаете с помощью include/require

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

Не понял...

Попытался представить чтоже должно у меня получится если отпарсить такой такой шаблон:



{{loop id=L1}}
    <h3>{{Heading}}</h3>
    <ul>
        {{loop id=L2}}
        <li>{{Item}}</li>
        {{loop;}}
    </ul>
{{loop;}}



Код на пхп:



<?php

Class Node {

    public 
$vars = array();
    public 
$childs = array();

    public function  
__construct($vars = array(), $childs = array()) {
        
$this->vars $vars;
        
$this->childs $childs;
    }

}

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

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






Array
(
    [L1] => Array
        (
            [0] => Node Object
                (
                    [vars] => Array
                        (
                            [Heading] => Работа
                        )

                    [childs] => Array
                        (
                            [L2] => Array
                                (
                                    [0] => Node Object
                                        (
                                            [vars] => Array
                                                (
                                                    [Item] => Резюме
                                                )

                                            [childs] => Array
                                                (
                                                )

                                        )

                                    [1] => Node Object
                                        (
                                            [vars] => Array
                                                (
                                                    [Item] => Вакансии
                                                )

                                            [childs] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

            [1] => Node Object
                (
                    [vars] => Array
                        (
                            [Heading] => Недвижимость
                        )

                    [childs] => Array
                        (
                            [L2] => Array
                                (
                                    [0] => Node Object
                                        (
                                            [vars] => Array
                                                (
                                                    [Item] => Жильё
                                                )

                                            [childs] => Array
                                                (
                                                )

                                        )

                                    [1] => Node Object
                                        (
                                            [vars] => Array
                                                (
                                                    [Item] => Коммерческая
                                                )

                                            [childs] => Array
                                                (
                                                )

                                        )

                                    [2] => Node Object
                                        (
                                            [vars] => Array
                                                (
                                                    [Item] => Производство
                                                )

                                            [childs] => Array
                                                (
                                                )

                                        )

                                    [3] => Node Object
                                        (
                                            [vars] => Array
                                                (
                                                    [Item] => Прочая нежилая
                                                )

                                            [childs] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

)



Вот думаю как покрасивше синтаксис сделать, типо такого:


<?php

$tpl
->LOOP["L1"][0]->vars["Heading"] = "Работа";
$tpl->LOOP["L1"][0]->LOOP["L2"][0]->vars["Item"] = "Резюме";
$tpl->LOOP["L1"][0]->LOOP["L2"][1]->vars["Item"] = "Вакансии";
// ...

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

я имел ввиду примерно такую схему:
контроллер создает объект класса -> открывает шаблон (например template.tpl) -> парсит (заменяет {{ на <?php и т.п) -> сохраняет разобранный шаблон как php-файл (например template.tpl.php) ->разобранный шаблон подключается в контроллер.

а вообще передача параметров у вас сложная какая-то очень

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

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

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

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

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

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

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

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

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

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

  Ответить  
 
 автор: Красная_шляпа   (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);

?>

  Ответить  
 
 автор: Красная_шляпа   (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}}



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

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

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

  Ответить  
 
 автор: Красная_шляпа   (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 в 21:51)   письмо автору
 
   для: Красная_шляпа   (18.11.2010 в 20:51)
 

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

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

  Ответить  
Rambler's Top100
вверх

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