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 , $ergebniss , PREG_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 , $varis , PREG_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?