作者:mqfcu123 | 来源:互联网 | 2013-07-22 14:07
smarty的功能非常强大,不是下面几行代码可以实现的,但是我们可以取出其中的一部分,通过正则实现,比如简单的assign,display,编译缓存,内容缓存等,我们这里只是一个Demo,基本实现了assign和display,以及编译文件的缓存。其实内容的缓存也非常简单,就是文件的写入操作,包括缓存周期,物理文件路径等。这些都可以通过文件操作实现,但由于篇幅所限,所以这里不再赘述。
1
|
// index.php文件是个入口文件,代码如下
|
2
|
require_once('my_smarty.php');
|
4
|
$demo->assign('title','smarty demo');
|
5
|
$demo->assign('content','hello iphper');
|
6
|
$demo->display('index.html');
|
01
|
// my_smarty.php代码如下 这是一个类
|
05
|
private$tpl_vars=array();
|
07
|
publicfunction__construct($template_dir='./template',$compile_dir='./compile') {
|
09
|
// 默认模板目录和编译之后的文件目录都在当前文件下面
|
10
|
$this->template_dir = rtrim($template_dir,'/').'/';
|
11
|
$this->compile_dir = rtrim($compile_dir,'/').'/';
|
13
|
publicfunctionassign($tpl_var,$value=null) {
|
15
|
$this->tpl_vars[$tpl_var] =$value;
|
18
|
publicfunctiondisplay($file_name) {
|
19
|
$tpl_file=$this->template_dir.$file_name;
|
20
|
if(!file_exists($tpl_file)) {
|
25
|
$compile_file_name=$this->compile_dir.'com_'.$file_name.'.php';
|
27
|
// 当编译文件不存在或者修改之后重新编译文件
|
28
|
if(!file_exists($compile_file_name) ||filemtime($tpl_file) >filemtime($compile_file_name)){
|
29
|
$compile_file_cOntent=$this->tpl_replace(file_get_contents($tpl_file));
|
30
|
file_put_contents($compile_file_name,$compile_file_content);
|
32
|
include($compile_file_name);
|
35
|
privatefunctiontpl_replace($content) {
|
39
|
$pattern=array('/\{\s*\$([a-zA-Z_]\w*)\s*\}/i');
|
41
|
$replace=array('tpl_vars["${1}"];?>');
|
43
|
// 注意如何反引用 ${1} 等价 \\1
|
45
|
$replaced= preg_replace($pattern,$replace,$content);
|
1
|
// 模板编译后的文件 位于compile目录下
|
6
|
tpl_vars["content"];?> good
|
上述实例涉及到php面向对象的一些知识点,所以不太适合初学者。但是目前个人时间原因就给了这个例子,其他控制用户输入的正则很多,网上比比皆是,所以就略去了。但是并不代表我们会了,所以有时间要多看看别人怎么写,自己多应用应用,孰能生巧。正则强大的功能有待我们继续探讨,以后我将继续给出相关综合实例。