PHP自写简单模板引擎,供新手学习

今天要写点小东西,突然想到要用模板引擎。就“随手”写了一个,发上来供新手学习。搞了这么久PHP,想想也真是感慨,当年研究了几天的东西现在一两个小时就弄完了,当年一起完耍的女神现在已经不知所踪了。。。咳咳,下面是代码:

<?php

/****************
 * @author: 一曲忧伤
 * @email: [email protected]
 * @discription: 简单模板引擎
 */

class view {

    var $tpl_dir = 'template';
    var $cache_dir = 'cache';
    var $tpl_ext = '.html';
    var $var_left = '{';
    var $var_right = '}';

    function __construct($config=array()) {
        extract($config);
        if(isset($tpl_dir))$this->tpl_dir = $tpl_dir;
        if(isset($cache_dir))$this->cache_dir = $cache_dir;
        if(isset($tpl_ext))$this->tpl_ext = $tpl_ext;
        if(isset($var_left))$this->var_left = $var_left;
        if(isset($var_right))$this->var_right = $var_right;
    }

    function load($tplfilename) {
        $tplfile = $this->tpl_dir.'/'.$tplfilename.$this->tpl_ext;
        if(!file_exists($tplfile))
            die('Template not found: '.$tplfile);
        return $this->cache($tplfilename, $tplfile);
    }

    //判断模板是否缓存,如模板文件有更改则重新编译
    function cache($tplname, $tpl_file) {
        $cache_file = $this->cache_dir.'/'.md5($tplname).'.php';
        if(!file_exists($cache_file) || filemtime($tpl_file)>filemtime($cache_file))
            $this->compile($tpl_file, $cache_file);
        return $cache_file;
    }

    //编译模板内容到PHP格式,并写入缓存
    function compile($tpl, $cache) {

        $body = file_get_contents($tpl);
        $vl = $this->var_left;
        $vr = $this->var_right;

        $patterns = array(
            "#$vl\s*include:(.+?)\s*$vr#i",
            "#$vl\s*if\s+(.+?)\s*$vr#i",
            "#$vl\s*else\s*$vr#i",
            "#$vl\s*elseif\s+(.+?)\s*$vr#i",
            "#$vl\s*endif\s*$vr#i",
            "#$vl\s*/if\s*$vr#i",
            "#$vl\s*foreach\s+(.+?):(.+?)\s*$vr#i",
            "#$vl\s*endforeach\s*$vr#i",
            "#$vl\s*/foreach\s*$vr#i",
            "#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i",
            "#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i",
            "#$vl([0-9a-zA-Z_\[\]\'\"]+?)$vr#i",
            "#$vl([0-9a-zA-Z_]+?):(.*?)$vr#i"
        );
        $replacements = array(
            "<?php include show('\\1'); ?>",
            "<?php if(\\1): ?>",
            "<?php else: ?>",
            "<?php elseif(\\1): ?>",
            "<?php endif; ?>",
            "<?php endif; ?>",
            "<?php if(count($\\1)>0):\$autoindex=0;foreach($\\1 as \\2):\$autoindex++; ?>",
            "<?php endforeach;endif; ?>",
            "<?php endforeach;endif; ?>",
            "<?php echo $\\1['\\2']['\\3']; ?>",
            "<?php echo $\\1['\\2']; ?>",
            "<?php echo $\\1; ?>",
            "<?php echo \\1(\\2); ?>"
        );

        $body = preg_replace($patterns, $replacements, $body);
        file_put_contents($cache, $body);
    }
}

$view = new view();
function show($tpl) {
    global $view;
    return $view->load($tpl);
}

使用方法PHP文件:

<?php
include 'view.php';
$title = '文档标题';
$a=array('a'=>'rows','b'=>array('c'=>'inarray'));

include show('index');

使用方法HTML模板文件:

<html>
<head>
<title>{title}</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
</head>
<body>
你好,仅供参考<br/>
{a.a}
{a.b.c}<br/>
{foreach a:$v}
{autoindex}.{v}<br/>
{/foreach}
</body>
</html>
{include:footer}

模板文件放在template目录,缓存放在cahce目录,这两个目录都要手动创建。可以使用

{include:子模板}

{if 条件}

{foreach 变量:as语句},$autoindex为自增变量

{调用函数:参数}

{变量},包含数组变量简化写法(最多只支持三维数组)

等语法。

好了,整个模板引擎实现比较简单,因为一直比较喜欢这种include方式的模板,只供新手学习原理就好了。

=====================国际惯例=======================

刚开始学着写一些博客,写得不好的地方请见谅,觉得还可以就赏脸赞下吧!

我的QQ群(PHP)336533596,QQ 451309839,欢迎加入。相互交流,聊天吹牛~

时间: 2024-08-27 21:51:56

PHP自写简单模板引擎,供新手学习的相关文章

简单算法分析2 ------适合新手学习算法分析

自从发表了第一篇算法分析文章起,自己打心底上就喜欢上算法分析了,O(∩_∩)O哈哈~. 好了,今天继续分享一个简单的算法分析文章,虽然也是参考别人的文章,但是只学理论不去实践的话,永远都开不到东西,所以我选择了自己动手跟着别人的分析文章走,然后再结合自己的思路来进行分析,写注册机. 本文参考文章:http://blog.sina.com.cn/u/2295763487 [软件名称]: SecureExplore 3.3[下载地址]: http://www.onlinedown.net/soft/

javascript模板引擎之artTemplate 学习笔记

<div id="content"></div><div id="content1"></div><h1>在javascript中存放模板</h1><div id="content2"></div><div id="content3"></div><h1>辅助方法</h1><di

写一个迷你模板引擎

一直想写一个模板引擎用在自己的代码上,因为之前用的一个开源的产品,每次需要变通的时候都会遇到一些局限性,不如自己写的实在,想改哪就改哪,于是今天花了一点时间造了一个很小的模板引擎,核心功能已经存在,其他的待到以后慢慢的扩充. 模板引擎说白了,就是找到页面上的占位符,然后替换掉,再插入到页面中,不管功能还是实现方法都极其简单. 占位符也就两个地方能够出现的: 文本节点 属性值 通过childNodes能够找到文本节点,通过attributes能够找到该元素下的所有存在属性值,所以请看代码,以下代码

asp.net正则模板引擎代码

我们申明一个数组 public static Regex[] r = new Regex[23]; 接下来关键的正则表达式: RegexOptions options = RegexOptions.None; //嵌套模板标签(兼容) r[0] = new Regex(@"<!--{template ((skin=\\""([^\[\]\{\}\s]+)\\""(?:\s+))?)src=(?:\/|\\"")([^\[\]\{\

前端学PHP之自定义模板引擎

什么是网站模板?准确地说,是指网站页面模板,即每个页面仅是一个板式,包括结构.样式和页面布局,是创建网页内容的样板,也可以理解为已有的网页框架.可以将模板中原有的内容替换成从服务器端数据库中动态内容,目的是可以保持页面风格一致 PHP是一种HTML内嵌式的在服务器端执行的脚本语言,所以大部分PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程.虽然通过MVC设计模式可以把程序应用逻辑与网页呈现逻辑强制性分离,但也只是将应用程序的输入.处理和输出分开,网页呈现逻辑(视图)还会有HTML代

TinyTemplate模板引擎火热出炉,正式开源了

涉水模板引擎领域,纯属不小心.在此对以下人员表示强烈感谢与致敬:@sub jetbrick作者@sept@webit webit作者@罗格林 rythm作者@闲.大赋 beetl作者以及许许多多虽然没有列出来,但是在我写tinytemplate时帮助过我的人. 序言 本来是没有自己写一个模板引擎的计划的,因为按我的理解,一直认为这种“语言”级的引擎,难度是非常大的.总感觉自己的水平不够,因此不敢有这个念头.直到大量使用Velocty的时候,碰到velocty诸多不尽如人意的地方,但是又无能为力,

PHP的自定义模板引擎

前面的话 在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构,然后工程被返回到前端工程师继续完善.就这样工程可能在后端工程师和前端工程师之间来来回回好几次.由于后端工程师不干预任何相关HTML标签,同时也不需要前端代码和后端代码混合在一起.前端工程师只需要配置文件,动态区块和其他的界面部分,不必要去接触那些错综复杂的后端代码.因此,这时候有一个很好的模板支持

怎样让百度快速收录(适合新手学习,老手参考)

一个100%新站,30秒被收录,一个月就做到权重文章秒收,这必定是有真功夫的. 前提,是你要知道百度收录永远跟你网站评分有关. 分数不够,就不收录,分数够了,就收录,就怎么简单. 问题来了……怎样能提高分数? 不啰嗦. 洪雨总结一下自己实践操作中发现的因素,供新手学习,老手参考. 1.原创因素(你不一定真知道什么叫原创) 原创是首要因素,你会说,这个谁都知道,能不能说点新鲜的. 可有时候你自己写的文章,确实是原创,但是百度也不一定收录. 知道这为什么吗? 因为你的标题,没有写好,标题是一个内页的

新手学习 React 迷惑的点

网上各种言论说 React 上手比 Vue 难,可能难就难不能深刻理解 JSX,或者对 ES6 的一些特性理解得不够深刻,导致觉得有些点难以理解,然后说 React 比较难上手,还反人类啥的,所以我打算写两篇文章来讲新手学习 React 的时候容易迷惑的点写出来,如果你还以其他的对于学习 React 很迷惑的点,可以在留言区里给我留言. 为什么要引入 React 在写 React 的时候,你可能会写类似这样的代码: import React from 'react' function A() {