Ich arbeite im Moment an einem Templatesystem. Dieses soll auch Blöcke unterstützen, also bestimmte Textbereiche, die wiederholt werden können. Beispiel:
Code:
<table>
<!-- BEGIN row -->
<tr>
 <td>{row.name}</td>
 <td>{row.inhalt}</td>
</tr>
<!-- END row -->
</table>
Der entsprechende PHP Code:
PHP-Code:
$template->set_block_vars("row", array("name" => array("Name1""Name2")
                                                                   
"inhalt" => array("Inhalt1""Inhalt2"))); 
Das funktioniert soweit auch, nur nicht bei verschachtelten Blöcken. Ich mache das ganze mit einem preg_match_all():
PHP-Code:
if(preg_match_all("#\\<\\!\\-\\- BEGIN ([a-zA-z0-9]+) \\-\\-\\>#"$text$ergebnissPREG_SET_ORDER))
      foreach(
$ergebniss as $block) {
        
$temp explode("<!-- BEGIN ".$block[1]." -->"$text);
        
$temp explode("<!-- END ".$block[1]." -->"$temp[1]);
        
$block_content $temp[0];
        
$max 0;
        
$block_replace "";
        if(
preg_match_all("#\\{(".$block[1]."\\.([a-zA-z0-9]+))\\}#"$block_content$varisPREG_SET_ORDER)) {
          foreach(
$varis as $vari)
            if(
count($this->blockvaris[$block[1]][$vari[2]]) > $max)
              
$max count($this->blockvaris[$block[1]][$vari[2]]);
          for(
$i 0$i $max$i++) {
            
$akt_block $block_content;
            foreach(
$varis as $vari) {
              
$akt_block str_replace("{".$vari[1]."}"$this->blockvaris[$block[1]][$vari[2]][$i], $akt_block);
            }
            
$block_replace .= $akt_block;
          }
        } else
          if(isset(
$this->blockvaris[$block[1]]))
            
$block_replace $block_content;
        
$text str_replace("<!-- BEGIN ".$block[1]." -->".$block_content."<!-- END ".$block[1]." -->"$block_replace$text);  
      } 
Hat vielleicht jemand eine Idee wie ich das auch bei verschachtelten Blöcken hinbekommen könnte?