欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

超级精简的php模板解析引擎 iSmarty

程序员文章站 2022-04-16 11:05:36
...

1. [代码][PHP]代码

<?php
class iSmarty
{
    /*
     * The name of the directory where templates are located.
     * @var string
     */
    var $templatedir = '/';
    
    /*
     * The directory where compiled templates are located.
     * @var string
     */
    var $compiledir = 'test/';
    
    /*
     * where assigned template vars are kept
     * @var array
     */
    var $vars = array();
    
    /*
     * compile a resource
     * sets PHP tag to the compiled source
     * @param string $tpl (template file)
     */
    function parse($tpl)
    {
        // load template file //
        $fp   = @fopen($tpl, 'r');
        $text = fread($fp, filesize($tpl));
        fclose($fp);
        // repalce template tag to PHP tag //
        $text        = str_replace('{/if}', '<?php } ?>', $text);
        $text        = str_replace('{/loop}', '<?php } ?>', $text);
        $text        = str_replace('{foreachelse}', '<?php } else {?>', $text);
        $text        = str_replace('{/foreach}', '<?php } ?>', $text);
        $text        = str_replace('{else}', '<?php } else {?>', $text);
        $text        = str_replace('{loopelse}', '<?php } else {?>', $text);
        // template pattern tags //
        $pattern     = array(
            '/\$(\w*[a-zA-Z0-9_])/',
            '/\$this\-\>vars\[\'(\w*[a-zA-Z0-9_])\'\]+\.(\w*[a-zA-Z0-9])/',
            '/\{include file=(\"|\'|)(\w*[a-zA-Z0-9_\.][a-zA-Z]\w*)(\"|\'|)\}/',
            '/\{\$this\-\>vars(\[\'(\w*[a-zA-Z0-9_])\'\])(\[\'(\w*[a-zA-Z0-9_])\'\])?\}/',
            '/\{if (.*?)\}/',
            '/\{elseif (.*?)\}/',
            '/\{loop \$(.*) as (\w*[a-zA-Z0-9_])\}/',
            '/\{foreach \$(.*) (\w*[a-zA-Z0-9_])\=\>(\w*[a-zA-Z0-9_])\}/'
        );
        // replacement PHP tags //
        $replacement = array(
            '$this->vars[\'\1\']',
            '$this->vars[\'\1\'][\'\2\']',
            '<?php $this->display(\'\2\')?>',
            '<?php echo \$this->vars\1\3?>',
            '<?php if(\1) {?>',
            '<?php } elseif(\1) {?>',
            '<?php if (count((array)\$\1)) foreach((array)\$\1 as \$this->vars[\'\2\']) {?>',
            '<?php if (count((array)\$\1)) foreach((array)\$\1 as \$this->vars[\'\2\']=>$this->vars[\'\3\']) {?>'
        );
        // repalce template tags to PHP tags //
        $text = preg_replace($pattern, $replacement, $text);
        
        // create compile file //
        $compliefile = $this->compiledir . basename($tpl) . '.php';
        if ($fp = @fopen($compliefile, 'w')) {
            fputs($fp, $text);
            fclose($fp);
        }
    }
    
    /*
     * assigns values to template variables
     * @param array|string $k the template variable name(s)
     * @param mixed $v the value to assign
     */
    function assign($k, $v = null)
    {
        $this->vars[$k] = $v;
    }
    
    /*
     * ste directory where templates are located
     * @param string $str (path)
     */
    function templateDir($path)
    {
        $this->templatedir = $this->pathCheck($path);
    }
    
    /*
     * set where compiled templates are located
     * @param string $str (path)
     */
    function compileDir($path)
    {
        $this->compiledir = $this->pathCheck($path);
    }
    
    /*
     * check the path last character
     * @param string $str (path)
     * @return string
     */
    function pathCheck($str)
    {
        return (preg_match('/\/$/', $str)) ? $str : $str . '/';
    }
    
    /*
     * executes & displays the template results
     * @param string $tpl (template file)
     */
    function display($tpl)
    {
        $tplfile = $this->templatedir . $tpl;
        if (!file_exists($tplfile)) {
            exit('can not load template file : ' . $tplfile);
        }
        $compliefile = $this->compiledir . $tpl . '.php';
        if (!file_exists($compliefile) || filemtime($tplfile) > filemtime($compliefile)) {
            $this->parse($tplfile);
        }
        include_once($compliefile);
    }
}

?>

2. [代码][PHP]代码

<?php
include 'iSmarty.php';
$tpl = new iSmarty();
$tpl->assign('title','标题');
$tpl->assign('Name','名字');

$contact = array('1'=>'张一','2'=>'zhang2');
$tpl->assign('contact',$contact);
$tpl->display('test.html');

?>

3. [代码][PHP]代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<p>{$title} - {$Name}</p>
{foreach $contact  key=>val}
	{$key}: {$val}<br>
{/foreach}
</body>
</html>


4. [文件] test.zip

超级精简的php模板解析引擎 iSmartytest.zip