Source: easytemplate-1.2.phps - download
<?php
/*
 @ Project: EasyTemplate 1.2.1
 @ Link http://daif.net/easy/
 @ Author Daifallh Al-Otaibi <daif55@gmail.com>
*/
    class EasyTemplate{
        var $vars; //Reference to $GLOBALS 
        var $HTML; //html page content
        var $page; //
        var $Temp="./template";// your template path OR "./"
        var $Cache="easycache";// must be writeable check permission OR use $_ENV["TEMP"];
        var $color = array();

        //patterns Array
        var $pats = array(
        //Foreach Variables
        "/{{([A-Z0-9_\]\[\"]{1,})}}/i",
        //Globals Variables
        "/{([A-Z0-9_\]\[\"]{1,})}/i",
        //Foreach Statement
        "/<LOOP\s+NAME\s*=\s*(\"|)+([a-z0-9_]{1,})+(\"|)\s*>/i",
        //Foreach Statement With Limited Value
        "/<LOOP\s+NAME\s*=\s*(\"|)+([a-z0-9_]{1,})+(\"|)\s*LIMIT\s*=\s*(\"\\d+\"|\\d+)\s*>/i",
        "/<\/LOOP>/i",
        //IF & Else Statement
        "/<IF\s+NAME\s*=\s*\"([A-Z0-9_]{1,})=(.+)\"\s*>/i",
        "/<IF\s+NAME\s*=\s*(\"|)+([a-z0-9_]{1,})+(\"|)\s*>/i",
        "/<ELSE>/i",
        "/<\/IF>/i",
        //Switch Statement
        "/<SWITCH\s+NAME\s*=\s*\"([A-Z0-9_]{1,})\"\s*CASE\s*=\s*\"(.+)\"\s*VALUE\s*=\s*\"(.+)\"\s*>/i",
        //Include Statement
        "/<INCLUDE\s+NAME\s*=\s*\"(.+)\"\s*>/iU"
        );
        //Replacements Array
        var $reps = array(
        "<?= \$var[\"\\1\"]?>",
        "<?= \$this->vars[\"\\1\"]?>",
        "<? foreach(\$this->vars[\"\\2\"] as \$key=>\$var){ ?>",
        "<? \$this->_limit(\"\\2\",\\4);foreach(\$this->vars[\"\\2\"] as \$key=>\$var){ ?>",
        "<? } ?>",
        "<? if(\$this->vars[\"\\1\"]==\"\\2\"){ ?>",
        "<? if(\$this->vars[\"\\2\"]){ ?>",
        "<?} else {?>",
        "<? } ?>",
        "<?= \$this->_switch(\$this->vars[\"\\1\"],\"\\2\",\"\\3\")?>",
        "<?= EasyTemplate::_include(\"\\1\",array(\$this->temp_path,\$this->cache_path)); ?>"
        );

    //Function to load a template file.
        function _load_file($FileName){
            if(!file_exists($this->Temp)) exit("<b>ERROR:</b> Template Folder $this->Temp Not Exists");
            if(!file_exists($FileName)) exit("<b>ERROR:</b> Template File $FileName Not Exists");
            $this->HTML = file_get_contents($FileName);//it is the preferred way to read the contents of a file into a string.
        }
    //Function to make limited Array, I wrote this function On Ramadan 3eed :)
        function _limit($arr_name,$limit=10){
            $arr  = $this->vars[$arr_name];
            $page = $this->vars[_GET][$arr_name.'_PS'];
            $pagestart = ($page*$limit > count($arr))?0:$page*$limit;
            $pageend   = ($page*$limit+$limit > count($arr))?count($arr):$page*$limit+$limit;//need some Optimization
            for($i=$pagestart;$i<$pageend;$i++) $page_array[] = $arr[$i];
            $this->vars[$arr_name] = $page_array;
            $query = preg_replace("/(\&|)$arr_name+_PS=\\d+/i","",$_SERVER[QUERY_STRING]);
            $prefix = ($query)?"?$query&":"?";
            for($i=0;$i<count($arr)/$limit;$i++)
            $this->vars[$arr_name.'_paging'] .= ($page==$i)?"<b>$i</b> ":"<a href=".$prefix.$arr_name."_PS=$i class=paging>$i</a> ";
        }
    //Function to Switch Color.
        function _sw($index){
            return $this->color["$index"] = ($this->color["$index"]) ? false:true;
        }
    //Function to Replace Array Variables
        function _replace_callback($matches){
            return str_replace('.','"]["',$matches[0]);
        }
    //Function to Replace Array Variables
        function _color_callback($matches){
            $rand = rand();
            return "<?= (\$this->_sw($rand)) ? \"$matches[1]\":\"$matches[2]\"?>";
        }
    //switch Tag
        function _switch($var,$case,$value){
            $case  = explode(',',$case);
            $value = explode(',',$value);
            foreach($case as $k=>$val)
            if($var==$val) return $value[$k];
        }
    //include Tag
        function _include($fn,$config){
            $this->temp_path  = $config[0];
            $this->cache_path = $config[1];
            return($this->display($fn));
        }
    //Function to Assign Veriables
        function assing($var,&$to){
            $GLOBALS[$var] = $to;
        }
    //Function to Clean Old Cache File
        function _clean($fn){
            $fn = (is_array(glob($fn)))?glob($fn):array();
            foreach ($fn as $file)    unlink($file);
        }
    //Function to parse the Template Tags
        function _parse(){
            $this->HTML = preg_replace_callback("/({[A-Z0-9_\.]{1,}})/i",array('EasyTemplate','_replace_callback'),$this->HTML);
            $this->HTML = preg_replace_callback("/(#[0-9A-Z]{6})\|(#[0-9A-Z]{6})/iU",array('EasyTemplate','_color_callback'),$this->HTML);
            $this->HTML = preg_replace($this->pats,$this->reps,$this->HTML);
        }
    //Function to OUTPUT
        function display($FileName) {
            $this->vars  = &$GLOBALS;
            $this->Cache = (!is_writeable($this->Cache))?$_ENV["TEMP"]:$this->Cache;
            $FileFullName     = $this->Temp."/".$FileName;
            $tmd = @filemtime($FileFullName);
            $CacheFileName = $this->Cache."/".$tmd.$FileName.".php";
            if(!file_exists($CacheFileName)){
                $this->_clean("./$this->Cache/*$FileName.php");
                $this->_load_file($FileFullName);
                $this->_parse();
                $fp = fopen($CacheFileName,"w");
                fwrite($fp,$this->HTML);
                fclose($fp);
            }
            ob_start();
            include($CacheFileName);
            $this->page = ob_get_contents();
            ob_end_clean();
            return $this->page;
        }
    }
?>