template_parse($content); $strlen = file_put_contents ( $compiledtplfile, $content ); chmod ( $compiledtplfile, 0777 ); return $strlen; } /** * 更新模板缓存 * * @param $tplfile 模板原文件路径 * @param $compiledtplfile 编译完成后,写入文件名 * @return $strlen 长度 */ public function template_refresh($tplfile, $compiledtplfile) { $str = @file_get_contents ($tplfile); $str = $this->template_parse ($str); $strlen = file_put_contents ($compiledtplfile, $str ); chmod ($compiledtplfile, 0777); return $strlen; } /** * 解析模板 * * @param $str 模板内容 * @return ture */ public function template_parse($str) { $str = preg_replace ( "/\{template\s+(.+)\}/", "", $str ); $str = preg_replace ( "/\{include\s+(.+)\}/", "", $str ); $str = preg_replace ( "/\{php\s+(.+)\}/", "", $str ); $str = preg_replace ( "/\{if\s+(.+?)\}/", "", $str ); $str = preg_replace ( "/\{else\}/", "", $str ); $str = preg_replace ( "/\{elseif\s+(.+?)\}/", "", $str ); $str = preg_replace ( "/\{\/if\}/", "", $str ); //for 循环 $str = preg_replace("/\{for\s+(.+?)\}/","",$str); $str = preg_replace("/\{\/for\}/","",$str); //++ -- $str = preg_replace("/\{\+\+(.+?)\}/","",$str); $str = preg_replace("/\{\-\-(.+?)\}/","",$str); $str = preg_replace("/\{(.+?)\+\+\}/","",$str); $str = preg_replace("/\{(.+?)\-\-\}/","",$str); $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\}/", "", $str ); $str = preg_replace ( "/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/", " \\3) { ?>", $str ); $str = preg_replace ( "/\{\/loop\}/", "", $str ); $str = preg_replace ( "/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "", $str ); $str = preg_replace ( "/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff:]*\(([^{}]*)\))\}/", "", $str ); $str = preg_replace ( "/\{(\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/", "", $str ); $str = preg_replace_callback("/\{(\\$[a-zA-Z0-9_\[\]\'\"\$\x7f-\xff]+)\}/s", array($this, 'addquote'),$str); $str = preg_replace ( "/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "", $str ); $str = preg_replace_callback("/\{pc:(\w+)\s+([^}]+)\}/i", array($this, 'pc_tag_callback'), $str); $str = preg_replace_callback("/\{\/pc\}/i", array($this, 'end_pc_tag'), $str); $str = "" . $str; return $str; } /** * 转义 // 为 / * * @param $var 转义的字符 * @return 转义后的字符 */ public function addquote($matches) { $var = ''; return str_replace ( "\\\"", "\"", preg_replace ( "/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var ) ); } public static function pc_tag_callback($matches) { return self::pc_tag($matches[1],$matches[2], $matches[0]);; } /** * 解析PC标签 * @param string $op 操作方式 * @param string $data 参数 * @param string $html 匹配到的所有的HTML代码 */ public static function pc_tag($op, $data, $html) { preg_match_all("/([a-z]+)\=[\"]?([^\"]+)[\"]?/i", stripslashes($data), $matches, PREG_SET_ORDER); $arr = array('action','num','cache','page', 'pagesize', 'urlrule', 'return', 'start'); $tools = array('json', 'xml', 'block', 'get'); $datas = array(); $tag_id = md5(stripslashes($html)); //可视化条件 $str_datas = 'op='.$op.'&tag_md5='.$tag_id; foreach ($matches as $v) { $str_datas .= $str_datas ? "&$v[1]=".($op == 'block' && strpos($v[2], '$') === 0 ? $v[2] : urlencode($v[2])) : "$v[1]=".(strpos($v[2], '$') === 0 ? $v[2] : urlencode($v[2])); if(in_array($v[1], $arr)) { ${$v[1]} = $v[2]; continue; } $datas[$v[1]] = $v[2]; } $str = ''; $num = isset($num) && intval($num) ? intval($num) : 20; $cache = isset($cache) && intval($cache) ? intval($cache) : 0; $return = isset($return) && trim($return) ? trim($return) : 'data'; if (!isset($urlrule)) $urlrule = ''; if (!empty($cache) && !isset($page)) { $str .= '$tag_cache_name = md5(implode(\'&\','.self::arr_to_html($datas).').\''.$tag_id.'\');if(!$'.$return.' = tpl_cache($tag_cache_name,'.$cache.')){'; } if (in_array($op,$tools)) { switch ($op) { case 'json': if (isset($datas['url']) && !empty($datas['url'])) { $str .= '$json = @file_get_contents(\''.$datas['url'].'\');'; $str .= '$'.$return.' = json_decode($json, true);'; } break; case 'xml': $str .= '$xml = pc_base::load_sys_class(\'xml\');'; $str .= '$xml_data = @file_get_contents(\''.$datas['url'].'\');'; $str .= '$'.$return.' = $xml->xml_unserialize($xml_data);'; break; case 'get': $str .= 'pc_base::load_sys_class("get_model", "model", 0);'; if ($datas['dbsource']) { $dbsource = getcache('dbsource', 'commons'); if (isset($dbsource[$datas['dbsource']])) { $str .= '$get_db = new get_model('.var_export($dbsource,true).', \''.$datas['dbsource'].'\');'; } else { return false; } } else { $str .= '$get_db = new get_model();'; } $num = isset($num) && intval($num) > 0 ? intval($num) : 20; if (isset($start) && intval($start)) { $limit = intval($start).','.$num; } else { $limit = $num; } if (isset($page)) { $str .= '$pagesize = '.$num.';'; $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}'; $str .= '$offset = ($page - 1) * $pagesize;'; $limit = '$offset,$pagesize'; $sql = 'SELECT COUNT(*) as count FROM ('.$datas['sql'].') T'; $str .= '$r = $get_db->sql_query("'.$sql.'");$s = $get_db->fetch_next();$pages=pages($s[\'count\'], $page, $pagesize, $urlrule);'; } $str .= '$r = $get_db->sql_query("'.$datas['sql'].' LIMIT '.$limit.'");while(($s = $get_db->fetch_next()) != false) {$a[] = $s;}$'.$return.' = $a;unset($a);'; break; case 'block': $str .= '$block_tag = pc_base::load_app_class(\'block_tag\', \'block\');'; $str .= 'echo $block_tag->pc_tag('.self::arr_to_html($datas).');'; break; } } else { if (!isset($action) || empty($action)) return false; if (module_exists($op) && file_exists(PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.$op.DIRECTORY_SEPARATOR.'classes'.DIRECTORY_SEPARATOR.$op.'_tag.class.php')) { $str .= '$'.$op.'_tag = pc_base::load_app_class("'.$op.'_tag", "'.$op.'");if (method_exists($'.$op.'_tag, \''.$action.'\')) {'; if (isset($start) && intval($start)) { $datas['limit'] = intval($start).','.$num; } else { $datas['limit'] = $num; } if (isset($page)) { $str .= '$pagesize = '.$num.';'; $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}'; $str .= '$offset = ($page - 1) * $pagesize;'; $datas['limit'] = '$offset.",".$pagesize'; $datas['action'] = $action; $str .= '$'.$op.'_total = $'.$op.'_tag->count('.self::arr_to_html($datas).');'; $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);'; $str .= '$pc_pages = pc_pages($'.$op.'_total, $page, $pagesize, $urlrule);'; } $str .= '$'.$return.' = $'.$op.'_tag->'.$action.'('.self::arr_to_html($datas).');'; $str .= '}'; } } if (!empty($cache) && !isset($page)) { $str .= 'if(!empty($'.$return.')){setcache($tag_cache_name, $'.$return.', \'tpl_data\');}'; $str .= '}'; } return "<"."?php if(defined('IN_ADMIN') && !defined('HTML')) {echo \"