php正则表达式—仿smarty

php中文网
发布: 2016-08-08 09:22:07
原创
1446人浏览过
    /**
类名为Smarty是自定义的模板引擎
通过该类对象加载模板文件并解析,将解析后的结果输出 
*/
class Smarty {
public $template_dir = 'templates';       //定义模板文件存放的目录  
public $compile_dir = 'templates_c';      //定义通过模板引擎组合后文件存放目录
public $left_delimiter  =  'public $right_delimiter =  '}>';          //在模板中嵌入动态数据变量的右定界符号
private $tpl_vars = array();              //内部使用的临时变量

        /** 
将PHP中分配的值会保存到成员属性$tpl_vars中,用于将板中对应的变量进行替换  
@paramstring$tpl_var需要一个字符串参数作为关联数组下标,要和模板中的变量名对应    
@parammixed$value需要一个标量类型的值,用来分配给模板中变量的值  
*/
function assign($tpl_var, $value = null) {   
if ($tpl_var != '')                   
$this->tpl_vars[$tpl_var] = $value;
}

        /** 
加载指定目录下的模板文件,并将替换后的内容生成组合文件存放到另一个指定目录下
@paramstring$fileName提供模板文件的文件名                                        
*/
         function display($fileName) { 
/* 到指定的目录中寻找模板文件 */
$tplFile = $this->template_dir.'/'.$fileName;  
/* 如果需要处理的模板文件不存在,则退出并报告错误 */
if(!file_exists($tplFile)) {              
die("模板文件{$tplFile}不存在!");
}
            /* 获取组合的模板文件,该文件中的内容都是被替换过的 */
$comFileName = $this->compile_dir."/com_".$fileName.'.php';  
            /* 判断替换后的文件是否存在或是存在但有改动,都需要重新创建 */
if(!file_exists($comFileName) || filemtime($comFileName) /* 调用内部替换模板方法 */
$repContent = $this->tpl_replace(file_get_contents($tplFile));  
/* 保存由系统组合后的脚本文件 */
file_put_contents($comFileName, $repContent);
}
/* 包含处理后的模板文件输出给客户端 */
include($comFileName);     
}
        
/**  
内部使用的私有方法,使用正则表达式将模板文件''中的语句替换为对应的值或PHP代码 
@paramstring$content提供从模板文件中读入的全部内容字符串   
@return$repContent返回替换后的字符串
*/
private function tpl_replace($content) {
/* 将左右定界符号中,有影响正则的特殊符号转义  例如,转义 */
$left = preg_quote($this->left_delimiter, '/');
$right = preg_quote($this->right_delimiter, '/');
/* 匹配模板中各种标识符的正则表达式的模式数组 */
$pattern = array(       
/* 匹配模板中变量 ,例如,""  */
'/'.$left.'s*$([a-zA-Z_-][a-zA-Z0-9_-]*)s*'.$right.'/i',
/* 匹配模板中if标识符,例如 " " */
'/'.$left.'s*ifs*(.+?)s*'.$right.'(.+?)'.$left.'s*/ifs*'.$right.'/ies', 
/* 匹配elseif标识符, 例如 "" */
'/'.$left.'s*elses*ifs*(.+?)s*'.$right.'/ies', 
/* 匹配else标识符, 例如 "" */
'/'.$left.'s*elses*'.$right.'/is',   
/* 用来匹配模板中的loop标识符,用来遍历数组中的值,  例如 " " */
'/'.$left.'s*loops+$(S+)s+$([a-zA-Z_-][a-zA-Z0-9_-]*)s*'.$right.'(.+?)'.$left.'s*/loops*'.$right.'/is',
/* 用来遍历数组中的键和值,例如 " $value }> "  */
'/'.$left.'s*loops+$(S+)s+$([a-zA-Z_-][a-zA-Z0-9_-]*)s*=>s*$(S+)s*'.$right.'(.+?)'.$left.'s*/loop s*'.$right.'/is', 
/* 匹配include标识符, 例如,'' */
'/'.$left.'s*includes+["']?(.+?)["']?s*'.$right.'/ie'                
);

/* 替换从模板中使用正则表达式匹配到的字符串数组 */
$replacement = array(  
/* 替换模板中的变量 tpl_vars["var"]; */
'tpl_vars["${1}"]; ?>',      
/* 替换模板中的if字符串 */
'$this->stripvtags('','${2}')',
/* 替换elseif的字符串 */
'$this->stripvtags('',"")',  
/* 替换else的字符串 */
'',   
/* 以下两条用来替换模板中的loop标识符为foreach格式 */
'tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}',  
'tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}',    
/*替换include的字符串*/
'file_get_contents($this->template_dir."/${1}")'        
);

/* 使用正则替换函数处理 */
$repContent = preg_replace($pattern, $replacement, $content);
/* 如果还有要替换的标识,递归调用自己再次替换 */
if(preg_match('/'.$left.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {       
$repContent = $this->tpl_replace($repContent);        

/* 返回替换后的字符串 */
return $repContent;                                  
}

         /**
内部使用的私有方法,用来将条件语句中使用的变量替换为对应的值
@paramstring$expr提供模板中条件语句的开始标记           
@paramstring$statement  提供模板中条件语句的结束标记  
@returnstrin将处理后的条件语句相连后返回
*/
private function stripvtags($expr, $statement='') {
/* 匹配变量的正则 */
$var_pattern = '/s*$([a-zA-Z_-][a-zA-Z0-9_-]*)s*/is'; 
/* 将变量替换为值 */
$expr = preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr); 
/* 将开始标记中的引号转义替换 */
$expr = str_replace("\"", """, $expr);
/* 替换语句体和结束标记中的引号 */
$statement = str_replace("\"", """, $statement); 
/* 将处理后的条件语句相连后返回 */
return $expr.$statement;                        
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

达芬奇
达芬奇

达芬奇——你的AI创作大师

达芬奇 50
查看详情 达芬奇

以上就介绍了php正则表达式—仿smarty,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号