Manni
01.05.2005, 07:53
Ich arbeite im Moment an einem Templatesystem. Dieses soll auch Blöcke unterstützen, also bestimmte Textbereiche, die wiederholt werden können. Beispiel:
<table>
<!-- BEGIN row -->
<tr>
<td>{row.name}</td>
<td>{row.inhalt}</td>
</tr>
<!-- END row -->
</table>
Der entsprechende 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():
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?
<table>
<!-- BEGIN row -->
<tr>
<td>{row.name}</td>
<td>{row.inhalt}</td>
</tr>
<!-- END row -->
</table>
Der entsprechende 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():
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?