Mam taką funkcję:
[PHP] class_template_compile.php - pobierz, plaintext
  1. private function parse_inhtmltag_tpl(&$content)
  2. {
  3. preg_match_all('#(<([\w]+)[^>]*tpl\:(.*?)\="(.*?)"*>)(.*?)((<\/\\2>)|(/\>))#i',$content,$long_htmls);
  4. preg_match_all('#<[a-z]+(.*?)tpl\:(.*?)\="(.*?)"(.*?)/\>#i',$content,$short_htmls);
  5. foreach ($long_htmls[3] as $id => $action)
  6. {
  7. $code = isset($this->inhtmltag_tpl_actions[$action]) ? $this->inhtmltag_tpl_actions[$action] : '';
  8. $html_code = str_replace(' tpl:' . $action . '="' . $long_htmls[4][$id] . '"','',$long_htmls[0][$id]);
  9. preg_match_all('#\{[a-zA-Z0-9_\-]+\}#',$html_code,$vars);
  10. foreach ($vars[0] as $id2 => $html)
  11. {
  12. $var_name = str_replace(array('{','}'),'',$html);
  13. $html_code = str_replace($html,'<?php echo $' . $long_htmls[4][$id] . '[\'' . $var_name .'\']; ?>',$html_code);
  14. }
  15. $code = sprintf($code,$long_htmls[4][$id],$long_htmls[4][$id],$html_code);
  16. $content = str_replace($long_htmls[0][$id],$code,$content);
  17. }
  18. foreach ($short_htmls[2] as $id => $action)
  19. {
  20. $code = isset($this->inhtmltag_tpl_actions[$action]) ? $this->inhtmltag_tpl_actions[$action] : '';
  21. $html_code = str_replace(' tpl:' . $action . '="' . $short_htmls[3][$id] . '"','',$short_htmls[0][$id]);
  22. preg_match_all('#\{[a-zA-Z0-9_\-]+\}#',$html_code,$vars);
  23. foreach ($vars[0] as $id2 => $var)
  24. {
  25. $var_name = str_replace(array('{','}'),'',$var);
  26. $html_code = str_replace($var,'<?php echo $' . $short_htmls[3][$id] . '[\'' . $var_name .'\']; ?>',$html_code);
  27. }
  28. $code = sprintf($code,$short_htmls[3][$id],$short_htmls[3][$id],$html_code);
  29. $content = str_replace($short_htmls[0][$id],$code,$content);
  30. }
  31. }
[PHP] class_template_compile.php - pobierz, plaintext


Tu przykładowy kod ($content):
  1. <div id="test" tpl:loop="l_li1" class="test123">
  2. <div id="a">
  3. 123
  4. </div>
  5. </div>
  6.  
  7. <div id="test" tpl:loop="l_li1" class="test123"><div id="a">123</div></div>
  8.  
  9. <img src="{src}" tpl:loop="l_img1" alt="{alt}" />
  10.  
  11. <ul>
  12. <li tpl:loop="l_li2"><a href="{href}">{name}</a></li>
  13. </ul>



Generuje:
  1. <div id="test" tpl:loop="l_li1" class="test123">
  2. <div id="a">
  3. 123
  4. </div>
  5. </div>
  6.  
  7. <?php foreach ($this->get_block_var('l_li1" class="test123') as $l_li1" class="test123) { ?>
  8. <div id="test"><div id="a">123</div>
  9. <?php } ?></div>
  10.  
  11. <?php foreach ($this->get_block_var('l_img1') as $l_img1) { ?>
  12. <img src="<?php echo $l_img1['src']; ?>" alt="<?php echo $l_img1['alt']; ?>" />
  13. <?php } ?>
  14.  
  15. <ul>
  16. <?php foreach ($this->get_block_var('l_li2') as $l_li2) { ?>
  17. <li><a href="<?php echo $l_li2['href']; ?>"><?php echo $l_li2['name']; ?></a></li>
  18. <?php } ?>
  19. </ul>



Błędy:
1. Olało tam, gdzie jest nowa linia (jak dałem po # s, zaczęło w innych tagach pobierać za dużo).
2. Złe są parametry dla foreacha drugiego diva.
3. W drugim divie w foreachu wzięło do pierwszego zamknięcia, a w tym przypadku powinno wziąć z drugim.
Co zrobić, aby to działało? I da się jakoś prościej to zapisać, bo mam wrażenie, że takim czymś morduję server?