代码
  1 <?php
  2 
  3 function parse_template($tplfile, $objfile) {
  4 global $options;
  5 
  6 //循环嵌套次数
  7 $nest = 3;
  8 
  9 //打开模板文件
 10 if(!$fp = fopen($tplfile, ‘rb’)) {
 11 exit(’Current template file not found or have no access!’);
 12 }
 13 
 14 $template = fread($fp, filesize($tplfile));
 15 fclose($fp);
 16 
 17 //匹配变量
 18 //双引号(单引号)内的\具有转义所以,要得到一个\必须写为\\;要得到一个$必须写为\$;最后结果为\$,可在正则中使用的变量符号
 19 $var_regexp = “((\\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(\[[a-zA-Z0-9_\-\.\”\’\[\]\$\x7f-\xff]+\])*)”;
 20 
 21 //匹配字符
 22 $const_regexp = “([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)”;
 23 
 24 //清除缩进(tab)
 25 $template = preg_replace(”/([\n\r]+)\t+/s”, “\\1, $template);
 26 
 27 //清除注释(<!– –>),方便后续操作,不需要匹配多余的<!–
 28 $template = preg_replace(”/\<\!\-\-\{(.+?)\}\-\-\>/s”, “{\\1}”, $template);
 29 
 30 //将{LF}替换成一个硬回车(\n)
 31 $template = str_replace(”{LF}”, “<?=\”\\n\“?>, $template);
 32 
 33 //匹配多种变量形式,包括$xxx[”xxxx”]与$xxx[$xxx]、或$xxx
 34 $template = preg_replace(”/\{(\\\$[a-zA-Z0-9_\[\]\’\”\$\.\x7f-\xff]+)\}/s”, “<?=\\1?>, $template);
 35 
 36 //使用/e修正符,可使替换元素以php代码执行后,再进行replace.
 37 $template = preg_replace(”/$var_regexp/es”, “addquote(’<?=\\1?>’)”, $template);
 38 
 39 //再次替换叠加字符串变量
 40 $template = preg_replace(”/\<\?\=\<\?\=$var_regexp\?\>\?\>/es”, “addquote(’<?=\\1?>’)”, $template);
 41 
 42 //子模板嵌套解析
 43 $template = preg_replace(”/[\n\r\t]*\{template\s+([a-z0-9_]+)\}[\n\r\t]*/is”, “\n<? include template(’\\1′); ?>\n”, $template);
 44 $template = preg_replace(”/[\n\r\t]*\{template\s+(.+?)\}[\n\r\t]*/is”, “\n<? include template(\\1); ?>\n”, $template);
 45 
 46 //eval语法解析
 47 $template = preg_replace(”/[\n\r\t]*\{eval\s+(.+?)\}[\n\r\t]*/ies”, “stripvtags(’\n<? \\1?>\n’,”)”, $template);
 48 
 49 //echo语法解析
 50 $template = preg_replace(”/[\n\r\t]*\{echo\s+(.+?)\}[\n\r\t]*/ies”, “stripvtags(’\n<? echo \\1?>\n’,”)”, $template);
 51 
 52 //elseif语法解析
 53 $template = preg_replace(”/[\n\r\t]*\{elseif\s+(.+?)\}[\n\r\t]*/ies”, “stripvtags(’\n<? } elseif(\\1) { ?>\n’,”)”, $template);
 54 
 55 //else语法解析
 56 $template = preg_replace(”/[\n\r\t]*\{else\}[\n\r\t]*/is”, “\n<? } else { ?>\n”, $template);
 57 
 58 for($i = 0$i < $nest$i++) {
 59 $template = preg_replace(”/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies”, “stripvtags(’\n<? if(is_array(\\1)) { foreach(\\1 as \\2) { ?>,'\n\\3\n<? } } ?>\n’)”, $template);
 60 $template = preg_replace(”/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies”, “stripvtags(’\n<? if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>’,'\n\\4\n<? } } ?>\n’)”, $template);
 61 $template = preg_replace(”/[\n\r\t]*\{if\s+(.+?)\}[\n\r]*(.+?)[\n\r]*\{\/if\}[\n\r\t]*/ies”, “stripvtags(’\n<? if(\\1) { ?>,'\n\\2\n<? } ?>\n’)”, $template);
 62 }
 63 
 64 //常量直接输出..
 65 $template = preg_replace(”/\{$const_regexp\}/s”, “<?=\\1?>”, $template);
 66 
 67 //相临定界符清除(使语法更加连贯)
 68 $template = preg_replace(”/ \?\>[\n\r]*\<\? /s”, ” “, $template);
 69 
 70 if(!@$fp = fopen($objfile, ‘wb’)) {
 71 exit(’Directory \’./cache/template/\’ not found or have no access!’);
 72 }
 73 
 74 //转换链接中的&符号为&使编译模板读取时能够正常不会将其视为引用..
 75 $template = preg_replace(”/\”(http)?[\w\.\/:]+\?[^\”]+?&[^\”]+?\”/e”, “transamp(’\\0′)”, $template);
 76 
 77 flock($fp, 2);
 78 fwrite($fp, $template);
 79 fclose($fp);
 80 }
 81 
 82 //转换&避免&以引用方式执行..
 83 function transamp($str) {
 84 $str = str_replace(’&’, ‘&’, $str);
 85 $str = str_replace(’&’, ‘&’, $str);
 86 $str = str_replace(’\”‘, ‘”‘, $str);
 87 return $str;
 88 }
 89 
 90 //将$var字符串,转换为可执行的php代码形式,并返回其结果..
 91 //\”转换为”,将为[xxx]转换为[’xxx’]
 92 function addquote($var) {
 93 return str_replace(”\\\”", “\”", preg_replace(”/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s”, “[’\\1′]”, $var));
 94 }
 95 
 96 //设置语言变量
 97 function languagevar($var) {
 98 return $GLOBALS[’language’][$var] ? $GLOBALS[’language’][$var] : “!$var!”;
 99 }
100 //清理或转换标签为php语法
101 function stripvtags($expr, $statement) {
102 $expr = str_replace(”\\\”", “\”", preg_replace(”/\<\?\=(\\\$.+?)\?\>/s”, “\\1“, $expr));
103 $statement = str_replace(”\\\”", “\”", $statement);
104 return $expr.$statement;
105 }
106 
107 ?>

 

posted on 2010-06-09 14:17  小炒花生米  阅读(2237)  评论(0编辑  收藏  举报