phpcms有自己的一套模板機制,代碼如下:
- function template_parse($str, $istag = 0)
- {
- $str = preg_replace("/([/n/r]+)/t+/s","//1",$str);
- $str = preg_replace("//</!/-/-/{(.+?)/}/-/-/>/s", "{//1}",$str);
- $str = preg_replace("//{template/s+(.+)/}/","<?php include template(//1); ?>",$str); 相當于
- $str = preg_replace("//{include/s+(.+)/}/","<?php include //1; ?>",$str);
- $str = preg_replace("//{php/s+(.+)/}/","<?php //1?>",$str);
- $str = preg_replace("//{if/s+(.+?)/}/","<?php if(//1) { ?>",$str);
- $str = preg_replace("//{else/}/","<?php } else { ?>",$str);
- $str = preg_replace("//{elseif/s+(.+?)/}/","<?php } elseif (//1) { ?>",$str);
- $str = preg_replace("//{//if/}/","<?php } ?>",$str);
- $str = preg_replace("//{loop/s+(/S+)/s+(/S+)/}/","<?php if(is_array(//1)) foreach(//1 AS //2) { ?>",$str);
- $str = preg_replace("//{loop/s+(/S+)/s+(/S+)/s+(/S+)/}/", "<?php if(is_array(//1)) foreach(//1 AS //2 => //3) { ?>",$str);
- $str = preg_replace("//{//loop/}/","<?php } ?>",$str);
- $str = preg_replace("//{//get/}/","<?php } unset(/$DATA); ?>",$str);
- $str = preg_replace("//{tag_([^}]+)/}/e", "get_tag('//1')", $str);
- $str = preg_replace("//{get/s+([^}]+)/}/e", "get_parse('//1')", $str);
- $str = preg_replace("//{([a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7 f-/xff:]*/(([^{}]*)/))/}/","<?php echo //1;?>",$str);
- $str = preg_replace("//{//$([a-zA-Z_/x7f-/xff][a-zA-Z0-9_ /x7f-/xff:]*/(([^{}]*)/))/}/","<?php echo //1;?>",$str);
- $str = preg_replace("//{(//$[a-zA-Z_/x7f-/xff][a-zA-Z0-9_/x7f-/xff]*)/}/","< ?php echo //1;?>",$str);
- $str = preg_replace("//{(//$[a-zA-Z0-9_/[/]/'/"/$/x7f-/xff]+)/}/es", "addquote('<?php echo //1;?>')",$str);
- $str = preg_replace("//{([A-Z_/x7f-/xff][A-Z0-9_/x7f-/xff ]*)/}/s", "<?php echo //1;?>",$str);
- if(!$istag) $str = "<?php defined('IN_PHPCMS') or exit('Access Denied'); ?>".$str; //Vevb.com
- return $str;
- }
其中先容幾個關鍵點:
/s 是將 代表任意符號的"."變成任意的符號。dedecms /s 是空格的意思.
$str = preg_replace("/([/n/r]+)/t+/s","//1",$str); 取括號中一個或者多個回車換行的字符并且外面有至少一個制表符的字符.
$str = preg_replace("//</!/-/-/{(.+?)/}/-/-/>/s", "{//1}",$str); //這是將注釋父里面變成大括號.
$str = preg_replace("//{include/s+(.+)/}/","<?php include //1; ?>",$str); //輸進的 include 將被替換成 <?php include ?>
$str = preg_replace("//{php/s+(.+)/}/","<?php //1?>",$str); //例如 {php echo "a"} 將被替換成 <?php echo "a";?>
$str = preg_replace("//{if/s+(.+?)/}/","<?php if(//1) { ?>",$str);
$str = preg_replace("//{else/}/","<?php } else { ?>",$str); 這個事講{if } {else} 替換<?php if ($a='1') echo a; else {a='b'}?> 替換的是 if +空格 +一個或者多個字符 if (//1)是取括號里的值也就是內存地址的值
$str = preg_replace("//{loop/s+(/S+)/s+(/S+)/}/","<?php if(is_array(//1)) foreach(//1 AS //2) { ?>",$str);
$str = preg_replace("//{loop/s+(/S+)/s+(/S+)/s+(/S+)/}/", "<?php if(is_array(//1)) foreach(//1 AS //2 => //3) { ?>",$str); // 這連個似乎拿出來有點疏漏http://www.pcbaike.net/,大家可以研究研究,測試時沒有合適的主要是取第一個括號中或者第二個括號中的數據假如是數組替換成foreach循環 $str = preg_replace("//{get/s+([^}]+)/}/e", "get_parse('//1')", $str);
這個事替換get標簽實質上是調用一個 get_parse 函數,有參函數.
新聞熱點
疑難解答