Template parser
Met deze template parser kan je variabelen uit een template parsen. If lussen zijn ook mogelijk. Voor wat code in de textarea, en druk op parse. In de template parser zijn al twee variabelen toegevoegd.${OBJECT} is gevuld met "kan".
${GETAL} is gevuld met koffie.
Resultaat van de template
// De variabele "object" overschrijven
// voorbeeld if
// voorbeeld if-else
Het object is geen glas maar een beker // voorbeelden if met cijfers vergelijken
Het getal is niet 15.
Het getal is niet 11
De beker is gevuld met koffie
// De variabele "object" overschrijven
// voorbeeld if
// voorbeeld if-else
Het object is geen glas maar een beker // voorbeelden if met cijfers vergelijken
Het getal is niet 15.
Het getal is niet 11
De beker is gevuld met koffie
Broncode:
<?php
class template_parser {
public $regex_ifclause = "/if\s{0,}\([\s\n]{0,}(.*?)[\s\n]{0,}(==|\!=|\>|\<|\<=|\>=)[\s\n]{0,}(.*?)[\s\n]{0,}\)[\s\n]{0,}\{[\s\n]{0,}(.*?)[\s\n]{0,}\}(;|(\s{0,}(else)\s{0,}\{\s{0,}(.*?)\s{0,}\};))/si";
public $regex_setvars = '/\$([a-z]+)\s{0,}=\s{0,}["|\']?([a-z]+)["|\']?;/is';
public $regex_printvars = '/\$\{(.*?)\}/';
public $var_undefined = 'undefined';
public $debugstring = "";
public $vars = array();
public function add_var($key, $value) {
$this->vars['${'.strtoupper($key).'}'] = $value;
}
function parse($string) {
$string = preg_replace_callback($this->regex_setvars, array($this, 'parse_setvars'), $string);
while(preg_match($this->regex_ifclause, $string)) {
$string = preg_replace_callback($this->regex_ifclause, array($this, 'parse_ifclause'), $string, 1);
}
$string = preg_replace_callback($this->regex_printvars, array($this, 'parse_printvars'), $string);
return $string;
}
private function parse_printvars($matches) {
$undefined = ($this->var_undefined) ? $this->var_undefined : $matches[0];
return (isset($this->vars['${'.strtoupper($matches[1]).'}'])) ? $this->vars['${'.strtoupper($matches[1]).'}'] : $undefined;
}
private function parse_setvars($matches) {
return $this->add_var($matches[1], $matches[2]);
}
private function parse_matches($matches) {
foreach($matches as $key => $value) {
if($this->vars[$value]) {
$matches[$key] = $this->vars[$value];
} else {
$matches[$key] = preg_replace('/["|\']+/', '', $matches[$key]);
}
}
return $matches;
}
function parse_ifclause($matches) {
$this->debugstring .= '<pre>'.htmlspecialchars(print_r($matches, true)).'</pre>';
$omatches = $matches;
$matches = $this->parse_matches($matches);
switch($matches[2]) {
case '==':
if($matches[1]==$matches[3]) {
return $omatches[4];
} elseif(isset($matches[8]) && $matches[7]=='else') {
return $omatches[8];
}
break;
case '!=':
if($matches[1]!=$matches[3]) {
return $omatches[4];
} elseif(isset($matches[7]) && $matches[7]=='else') {
return $omatches[8];
}
break;
case '>':case '<':case '<=': case '>=':
$a = preg_replace('/[^0-9]+/', '', $matches[1]);
$b = preg_replace('/[^0-9]+/', '', $matches[3]);
if( ($matches[2]=='>' && $a > $b) || ($matches[2]=='<' && $a < $b) || ($matches[2]=='<=' && $a <= $b) || ($matches[2]=='>=' && $a >= $b) ) {
return $omatches[4];
} elseif(isset($matches[7]) && $matches[7]=='else') {
return $omatches[8];
}
break;
}
}
}
$string = '
// De variabele "object" overschrijven<br />
$object = "beker";<br />
$drinken = "koffie";<br />
// voorbeeld if<br />
if ( ${OBJECT} == "kan" ) {
Het object is een kan.<br />
};
// voorbeeld if-else<br />
if ( ${OBJECT} == "glas" ) {
Het object is een glas.<br />
} else {
Het object is geen glas maar een ${OBJECT}
};
// voorbeelden if met cijfers vergelijken<br />
if( ${GETAL} >= 10 ) {
Het getal is groter of gelijk aan 10<br />
};
if( ${GETAL} == 15 ) {
Het getal is 15.<br />
} else {
Het getal is niet 15.<br />
};
if( ${GETAL} <= 10 ) {
Het getal is kleiner of gelijk aan 10<br />
};
if( ${GETAL} != 11 ) {
Het getal is niet 11<br />
};
De ${object} is gevuld met ${drinken}
';
?>
<div style="width: 505px; border: solid 1px #eee; margin: 0 auto; display:block; padding: 10px; font-size: 11px;">
<h1>Template parser</h1>
Met deze template parser kan je variabelen uit een template parsen. If lussen zijn ook mogelijk. Voor wat code in de textarea, en druk op parse. In de template parser zijn al twee variabelen toegevoegd. <br /><br />
${OBJECT} is gevuld met "kan".<br />
${GETAL} is gevuld met koffie.
</div><br />
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$string = stripslashes($_POST['string']);
}
$parser = new template_parser();
$parser->var_undefined = false;
$parser->add_var('object', 'kan');
$parser->add_var('getal', 10);
?>
<html><head></head><body>
<div style="width: 500px; border: solid 1px #eee; margin: 0 auto; padding: 10px; font-size: 9px; overflow:auto;"><b>Resultaat van de template</b><br /><?php
echo $parser->parse($string);
?></div><br />
<div style="width: 500px; border: solid 1px #eee; margin: 0 auto; padding: 10px; font-size: 9px; overflow:auto;">
<a href="javascript:void(0)" onclick="document.getElementById('debug').style.display = 'block';">Show debug</a> |
<a href="javascript:void(0)" onclick="document.getElementById('debug').style.display = 'none';">Hide debug</a>
</div>
<div id="debug" style="width: 500px; display:none; height: 250px; border: solid 1px #eee; margin: 0 auto; padding: 10px; font-size: 9px; overflow:auto;">
<?php echo $parser->debugstring ; ?>
</div>
<br />
<form action="" method="post">
<textarea name="string" style="width: 505px; height: 250px; border: solid 1px #eee; margin: 0 auto; display:block; padding: 10px; font-size: 9px;"><?php echo $string; ?></textarea>
<input type="submit" style="width: 525px; border: solid 1px #eee; background-color: #ccc; margin: 0 auto; padding: 10px;display:block;" value="parse" />
</form>
<?php
if(file_exists('voorbeelden/'.basename($_GET['vb']).'.php')) {
echo '<br /><br /><br /><b>Broncode:</b> <hr />';
highlight_file('voorbeelden/'.basename($_GET['vb']).'.php');
}
?></body></html>