php模版编译,php简单 模板技术

/**php简单 模板技术

* 作者:牛哄哄

* QQ:455703030

* 声明:我正则写的不地道,欢迎高手帮我修改一下

*      可自由传播、使用,但请保留此信息

*/

class FLEA_View_NHH

{

//模板存储目录

public $viewDir = null;

//缓存存储目录

public $cacheDir = null;

//是否过滤缓存中多余空格、Tab、回车

public $filterCache = true;

//模板中需要显示的数据

private $data = array();

public function __construct()

{

$viewConf = (array)FLEA::getAppInf('viewConfig');

if (empty($viewConf)) {

FLEA::loadClass('FLEA_Exception_ExpectedFile');

__THROW(new FLEA_Exception_ExpectedFile('The config file is not found: '.$viewConf));

}

$this->viewDir = $viewConf['viewDir'];

$this->cacheDir = $viewConf['cacheDir'];

$this->filterCache = $viewConf['filterCache'];

}

public function assign($var, $value)

{

$this->data[$var] = $value;

}

public function display($viewName)

{

$view = $this->viewDir.'/'.$viewName.'.html';

$cache = $this->cacheDir.'/'.$viewName.'.php';

if (!file_exists($view)) {

FLEA::loadClass('FLEA_Exception_ExpectedFile');

__THROW(new FLEA_Exception_ExpectedFile('The view file is not found: '.$view));

}

if (filemtime($view) > @filemtime($cache)) {

$this->parseView($view, $cache);

}

if (file_exists($cache)) {

if (!defined('IN_THIS_VIEW')) { define('IN_THIS_VIEW', TRUE); }

include($cache);

} else {

FLEA::loadClass('FLEA_Exception_ExpectedFile');

__THROW(new FLEA_Exception_ExpectedFile('The cache file has not read in correctly: '.$cache));

}

}

private function parseView($view, $cache = null)

{

/* 如果模板不存在,则输出错误消息 */

if (!file_exists($view)) {

FLEA::loadClass('FLEA_Exception_ExpectedFile');

__THROW(new FLEA_Exception_ExpectedFile('The view file is not found: '.$view));

}

/* 读取模板内容为一个字符串 */

$view = file_get_contents($view);

/* 将替换为{{ }} */

$view = str_replace(array(''), array('{{', '}}'), $view);

/* 清除注释 */

$view = preg_replace("/\{\{\*(.*?)\*\}\}/", '', $view);

/* 解析assign方法引入的变量 */

$view = preg_replace('/\$([A-Za-z0-9_] )/', '$this->data[\'\\1\']', $view);

/* 机械模板内部定义变量 */

$view = preg_replace('/\$\[([A-Za-z0-9_] )\]/', '$\\1', $view);

/* 解析{{ $var }}基本变量输出标签 */

$view = preg_replace('/\{\{\s*\$(. ?)\s*\}\}/', ' echo $\\1; ?>', $view);

/* 解析{{ include  }}标签 */

$view = preg_replace('/\{\{\s*include\s (. ?)\s*\}\}/', ' include \\1; ?>', $view);

/* 解析{{ html  }}标签 */

$view = preg_replace('/\{\{\s*html\s (. ?)\s*\}\}/', ' echo file_get_contents(\\1); ?>', $view);

/* 解析{{ code  }}标签 */

$view = preg_replace('/\{\{\s*code\s (. ?)\s*\}\}/', ' \\1; ?>', $view);

/* 解析{{ if  }}标签 */

$view = preg_replace('/\{\{\s*if\s (. ?)\s*\}\}/', ' if (\\1) { ?>', $view);

/* 解析{{ elseif  }}标签 */

$view = preg_replace('/\{\{\s*elseif\s (. ?)\s*\}\}/', ' } elseif(\\1) { ?>', $view);

/* 解析{{ while  }}标签 */

$view = preg_replace('/\{\{\s*while\s (. ?)\s*\}\}/', ' while (\\1) { ?>', $view);

/* 解析{{ foreach  }}标签 */

$view = preg_replace('/\{\{\s*foreach\s (. ?)\s*\}\}/', ' foreach (\\1) { ?>', $view);

/* 解析{{ for  }}标签 */

$view = preg_replace('/\{\{\s*for\s (. ?)\s*\}\}/', ' for (\\1) { ?>', $view);

/* 解析{{ else }}标签 */

$view = preg_replace('/\{\{\s*else\s*\}\}/', ' } else { ?>', $view);

/* 解析{{ /while }},{{ /if }},{{ /for }},{{ /foreach }}标签 */

$view = preg_replace('#\{\{\s*/[a-z] \s*\}\}#', ' } ?>', $view);

/* 递归解析嵌套的子模板 */

if (preg_match_all('/\{\{\s*view\s (. ?)\s*\}\}/', $view, $viewsInView)) {

/* 循环解析此模板中所有子模板,并将解析结果保存到数组$views */

$viewInViews = array();

foreach ($viewsInView[1] as $viewInView) {

$viewInViews[] = $this->parseView(eval('return '.$viewInView.';'));

}

/* 将该模板中所有子模板的标签分别替换为其对应的解析结果 */

$view = str_replace($viewsInView[0], $viewInViews, $view);

}

/* 合并相邻标签的解析结果 */

$view = preg_replace('/\?>\s*

/* 如果开启了缓存过滤,则过滤掉其中多余空格、Tab、回车 */

if ($this->filterCache == true) {

$view = preg_replace('/\s /', ' ', $view);

}

/* 如果是在解析子模板,则返回解析结果 */

if ($cache == null) { return $view; }

/* 加入防止直接访问缓存的代码 */

$view = ' if (!defined("IN_THIS_VIEW")) exit("The page is not found!"); ?>'.$view;

/* 将模板解析结果写入缓存文件 */

@file_put_contents($cache, $view);

}

}

/**

* 一、配置

* 配置文件请在FLEA的配置文件中修改

* 格式为:

* 'viewConfig' => array(

*   'viewDir' => '',    //模板文件路径

*   'cacheDir' => '',    //缓存文件路径

*   'filterCache' => true,   //是否在模板解析完毕后对缓存进行优化

* );

*

* 二、标签

* 模板文件后缀名为.html

* 标签同时支持两种或{{ }},你可以根据情况自由使用

* 1、{{* *}}  添加注释,只支持单行,多行的不知道怎么写,郁闷

* 2、{{ $abc }}  输出一个变量,变量的格式化输出请使用标签执行一个函数进行格式化输出

* 3、{{ $[abc] }}  输出一个模板内部定义的变量,变量名要用中括号括起来

* 4、{{ include 'abc/bcd.php' }}  包含一个动态文件,这个文件中可使用通过assign方法加入的变量和模板内部定义的变量,但不可以使用本引擎支持的标签

* 5、{{ html 'abc/bcd.html' }}  包含一个静态文件,此标签仅在PHP5下可用,被包含的文件中不可使用任何变量或标签,此标签可获得几倍于include标签的性能

* 6、{{ code echo substr($abc,1) }}  执行一段PHP代码,包括赋值,函数等等

* 7、{{ if $abc==1 }}和{{ elseif $abc==2 }}和{{ /if }}  判断,分支

* 8、{{ while $abc<1000 }}和{{ /while }}  while循环

* 9、{{ for $i=0;$i<1000;$i }}和{{ /for }}  for循环

* 10、{{ foreach $abc as $k => $v }}和{{ /foreach }}  foreach循环

* 11、{{ view 'abc/bcd.html' }}  嵌套另一个模板,支持模板的无限嵌套

*

* 注意:

* 1,include,html,view标签可使用常量来指定路径,这样会更加方便

* 2,assign引入的变量与模板内部定义的变量采用不同的命名空间,因此可重名

* 3,对于while,foreach,for循环需要引入的变量,最好采用模板内部定义的变量

* 4,模板内部定义变量 {{ code $[i]=1 }}

* 5,所有标签内部不可包含{}大括号,否则无法正确解析

* 6,所有标签的参数部分必须写为单行,否则无法正确解析

* 7,在调试时,为方便查看编译结果可关闭缓存优化,发布时,建议开启,可提高性能

* 8,此模板引擎仅可于FLEA下使用,若需不依赖FLEA的版本,请自行修改

* 9,标签中的参数使用PHP的语法

* 10,数组的引用与输出{{ $abc['id'] }}

* 11,所有标签一律小写

* 12,标签的参数中不可包含{{或}},否则会解析错误

*/

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值