Terug | Naar sckripts.nl



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

Show debug | Hide debug




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'), $string1);
        }
        
$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($matchestrue)).'</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>