PHP模版操作类!~

<?php
/*

  作者:♂T_gq♀,QQ:75754141,完成日期:05-1-3

   类说明:
         1.set_file(a,b);
       参数说明:a为文件引用别名,b为完整文件名.
    函数功能:设置、加载文件并检查文件名是否合法,并设置varkeys[a]="/{a}/";varvals[a]=b;并在file中注册;
    函数返回值:无
   2.set_var(a,b);
       参数说明:a为在HTML模版里{}里中的识别符,b为需替换的值.
    函数功能:设置varkeys[a]="/{a}/";varvals[a]=b;
    函数返回值:无
   3.get_var(a);
             参数说明:a为要在varvals里读取的数组下标;
    函数功能:返回a在varvals里的值.
    函数返回值:varvals[a];
   4.filename(filename);
      参数说明:filename为文件名变量
   函数功能:检查文件是否存在,文件不存在返回false,存在则将文件名设置成"./filename"格式;
   函数返回值:返回设置好的文件名格式
   5.varname(name);
      参数说明:name是一个在Html里的标识符
   函数功能:在name中含正则表达式的特殊符号前反斜杠;
   函数返回值:处理后的name;
   6.loadfile(name);
      参数说明:name文件别名,也可以是HTML里的标识符。
   函数功能:检查name是否在varvals数组中注册过,如注册过则返回true;如没有注册,则读取name文件并调用set_var函数设置
           varkeys[name]="/{name}/";varvals[name]="读出来的文件内容";
            函数返回值:如在varvals里注册过,则返回true,如读取文件未出错,则返回true;读取文件出错,则返回false.
   7.block(file_bm,block,block_bm);
      参数说明:file_bm为文件别名(注:file_bm文件中一定要包含block块),block为在file_bm中的一个要循环处理的块,block_bm为块的别名(不可省略).
      函数功能:将HTML模版中的块替换为"{block}"形式并用正则将处理后的块"{block}"取代file_bm文件中的原始未处理的块,并设置
           varkeys[block]="/{block}/";varvals[block]="未处理前的块";varkeys[block_bm]="/{block_bm}/";
     varvals[block_bm]="未处理前的块",在varvals数组中下标为block,block_bm的值是一样的,这是为了parse函数
     中的"$this->set_var($block_bm,$str.$fistr)"语句做提前准备.
   函数返回值:若file_bm文件未在varvals数组注册,则读取注册,如读取失败,返回为false.
   8.parse(block_bm,block,append);
      参数说明:block_bm为块别名,跟block设置的block_bm要保持一致;block为块的名称,跟block设置的block要保持一致;append为追加参数.
   函数功能:如果append的值为true,读出varvals[block_bm]的值调用subst函数进行替换,最后varvals[block_bm]的值为
           varvals[block]+varvals[block_bm]替换处理后的值;如果append的值为false,则将
     varvals[block]=varvals[block]+varvals[block_bm];就是简单的将2个模版文件的内容连接并存入varvals[block],输出2个文件的语句为:
     p(block);
   函数返回值:返回替换处理后的值(注:这里的值不等于varvals[block_bm]的值,因varvals[block_bm]=替换后的值+varvals[block],
             如果要varvals[block_bm]的值为替换后的值,则需:"set_var(block_bm,替换处理后的值,即本函数的返回值)".).
   9.subst(name);
      参数说明:name为需替换处理的标识,可以是文件别名,也可以是块别名.
   函数功能:将varvals[name]的值进行正则替换;
   函数返回值:替换处理后的值.
   10.p(name);
      参数说明:name为标识,可以是文件别名,可以是块别名,但必需在varvals数组中注册过.
   函数功能:输出subst函数处理后的值.
   返数返回值:无!
   11.msg($str);
      参数说明:str为错误信息字符
   函数功能:在屏幕输出错误信息
   函数返回值:无
   通过本类简单处理模版实例一:
   filename:main.ihtml
               <table>
      <!-- start rowlist -->
      <tr>
      <td>{param}</td>
      </tr>
      <!-- END rowlist -->
      </table>
      <table>
      <tr>
      <td>{param2},{title}</td>
      </tr>
      </table>
 <--------------------------------------------->
    filename:test1.php
         include_once('把类包含进来');
         $a=new temp();  //新建对象;
   $a->set_file("main","main.ihtml"); //设置文件main.ihtml,调用别名为main;
   $a->block("main","rowlist","mbk"); //设置块rowlist在文件main中,并起名块别名为mbk;
   $a->set_var("title","这里是标题");  //设置替换数据 将"这里是标题"替换为HTML模版里的{title};
   $a->set_var("param2","这是测试2"); 
   for($i=0;$i<3;$i++){
    $a->set_var("param",$i."abcdefg");
    $d=$a->parse("mbk","rowlist","true");  //进行块数据追加
    }
   $a->set_var("mbk",$d);  //设置块名别mbk被$d的值替换,$d为parse()函数处理后的返回值
   echo  $a->p("main");    //main文件别名执行替换输出;
   复杂实例2:
   filename1:main.ihtml
   内容同例1.
   filename2:2.ihtml
   <table>
   {abc}
   </table>
   <!--start page2 ---->
   <h2>{test2}</h2>
   <!-- end page2  ---->
   <-------------------------------------------->
   filename3:test.php
   $a=new temp();
   $a->set_file(array("main"=>"main.ihtml","main2"=>"2.ihtml"));  //输入main,main2文件
   $a->set_var(array("title"=>"这里是标题","param2"=>"这是测试2","abc"=>"这个是2.ihtml文件里的标识块")); //设置替换数据
   $a->block("main","rowlist","mbk");  //设置main文件里的rowlist块,块别名为mbk;
   for($i=0;$i<1;$i++){
    $a->set_var("param",$i."abcdefg");  //设置param标识的值
    $d=$a->parse("mbk","rowlist","true");  //执行块数据追加
    }
   $a->block("main2","page2","page2_bm");   //设置main2文件里的page2块,块别名为page2_bm
   for($i=0;$i<2;$i++){
      $a->set_var("test2",$i."呵呵");  //设置test2标识的值
   $e=$a->parse("page2_bm","page2","true");  //执行块数据追加
   }
  $a->set_var("mbk",$d);  //  设置mbk块的值为$d,$d为块mbk循环处理后的值
  $a->set_var("page2_bm",$e);  //设置page2_bm块的值为$e,$e为块page2_bm循环处理后的值
  $a->parse("main","main2");  //执行文件连接
  echo  $a->p("main");   //输出合并后的文件
  实例三:
       如在main.ihtml文件里加上标识2.ihtml文件的别名{main2},即在main.ihtml文件中需要包含2.ihtml文件的地方加入{main2};
    然后执行$this->p("main");输出,则2.ihtml文件会自动插入到main.ithml文件中.看下例:
   filename:main.ihtml
               <table>
      <!-- start rowlist -->
      <tr>
      <td>{param}</td>
      </tr>
      <!-- END rowlist -->
      </table>
      <table>
      <tr>
      <td>{param2},{title}</td>
      </tr>
      </table>
      {main2}
 <--------------------------------------------->
 filename:test.php
            $a=new temp();
   $a->set_file(array("main"=>"main.ihtml","main2"=>"2.ihtml"));
   $a->set_var(array("title"=>"这里是标题","param2"=>"这是测试2","abc"=>"这个是2.ihtml文件里的标识块"));
   $a->block("main","rowlist","mbk");
   for($i=0;$i<1;$i++){
    $a->set_var("param",$i."abcdefg");
    $d=$a->parse("mbk","rowlist","true");
    }
   $a->set_var("mbk",$d);
   $a->p("main");
*/
class temp{
 var $varkeys=array();
 var $varvals=array();
 var $file=array();
 var $root;
 function temp($root="."){
  //设置模版目录
  if(!is_dir($root)) {$this->msg("temp:未找到/"{$root}/"目录/n");return false;}
  $this->root=$root;
  return true;
 }

 function set_file($file_bm,$filename=""){
  if(is_array($file_bm)){
   reset($file_bm);
   while(list($a,$b)=each($file_bm)){
    $this->file[$a]=$this->filename($b);
    $this->loadfile($a);
   }
  }
   else {
  if($filename=="") {$this->msg("set_file:文件名不能为空/n");return false;}
  $this->file[$file_bm]=$this->filename($filename);
  //echo $this->file[$file_bm];  //设置file[$file_bm]=格式化后的文件名
  $this->loadfile($file_bm);
  }
 }

    function filename($filename){
  if(substr($filename,0,1)!="/") $filename=$this->root."/".$filename;
  else  $filename=$this->root.$filename;
  if(!file_exists($filename)) {$this->msg("filename:错误信息:/"$filename/",文件不存在/n");return false;}
  //echo $filename;  //调式输出设置好的文件名;
  return $filename;
 }
 function set_var($name,$value=""){
  if(is_array($name)){
   reset($name);
   while(list($a,$b)=each($name)){
    $this->varkeys[$a]="/".$this->varname($a)."/si";
    $this->varvals[$a]=$b;
   }
  }else{
  if(!empty($name)){
   $this->varkeys[$name]="/".$this->varname($name)."/si";
   $this->varvals[$name]=$value;
   //echo "varkeys[$name]=".$this->varkeys[$name]."/n"."varvals[$name]=".$this->varvals[$name];
   }
  }
 }
 function varname($varname){
  return preg_quote("{".$varname."}");
 }
 function get_var($var_xb){
  if(empty($this->varvals[$var_xb])) $this->msg("get_var:别名/"{$var_xb}/"的值为空/n");
  //echo $this->varvals[$var_xb];
  return $this->varvals[$var_xb];
 }
 function loadfile($file_bm){
  if(isset($this->varkeys[$file_bm])) Return true;
  if(!$this->file[$file_bm]) {$this->msg("loadfile:/"{$file_bm}/"文件别名未被初始化./n");return false;}
  $filename=$this->file[$file_bm];
  $str=implode("",@file($filename));
  if(empty($str)) { $this->msg("loadfile:/"{$filename}/"模版内容不能为空./n");return false;}
  // echo $str;//输出文件内容到屏幕
  $this->set_var($file_bm,$str);
  //echo "varkeys[$file_bm]".$this->varkeys[$file_bm]."/nvarvals[$file_bm]=".$this->varvals[$file_bm];
  Return true;
 }
    function block($file_bm,$block,$block_bm){
  if(!$this->loadfile($file_bm)) {$this->msg("block:{$file_bm}不存在于varvals变量数组中.");return false;}
  $fstr=$this->get_var($file_bm);   //返回$file_bm文件的内容;
  $reg="/<!--/s+start $block/s+-->(.*)<!--/s+end $block/s+-->/si";
  preg_match_all($reg,$fstr,$out);
  $fstr=preg_replace($reg,"{".$block_bm."}",$fstr); 
  //echo $fstr;//替换$blcok_bm后的$file_bm内容
  $this->set_var($file_bm,$fstr);
  //echo $this->get_var($file_bm);
  $this->set_var($block,$out[1][0]);//设置block在varvals中的内容,不可改变;
  $this->set_var($block_bm,$out[1][0]);  //设置block_bm在varvals中的内容,区别block_bm与block的原因为parse函数做前提准备
 }
 function subst($block_bm){
  if(!$this->loadfile($block_bm)) {$this->msg("subst:{$file_bm}未被初始化/n");Return false;}
  $str=$this->get_var($block_bm);  // 返回$block_bm内容的值
  $str=@preg_replace($this->varkeys,$this->varvals,$str);
        $this->set_var($block_bm,$str);  // 设置varvals[$block_bm]的值为替换后的数据
  return $str;
 }
 function parse($block_bm,$block,$append=false){
  if($append){
        $str=$this->get_var($block);  //block的值,不可改变,对应于block函数
  //echo $this->get_var($block_bm)."---------------------/n";
  $fistr=$this->subst($block_bm); //fistr为将block_bm替换处理后的值
  //echo $fistr."---------------------/n";
  $this->set_var($block_bm,$str.$fistr);
        return $fistr; //返回file_bm处理替换后的字符串
  }else{
  $this->set_var($block_bm,$this->get_var($block_bm).$this->get_var($block));
  }
 }
 function htmlc($str){
  //压缩HTML代码,去除回车空格等,去<testarea>标记进行处理
  $keys=array();  //定义数组,如不定义则会出现规则错误。
  $vals=array();
   $h_reg="/</!/-/-.*(-->)/Usi";  //去除<!--..-->注释(HTML)
 $reg="/<textarea[^>].*>.*<//textarea>/Uis";
 $js_reg="/<script[^>].*>.*<//script>/Uis";
 preg_match_all($js_reg,$str,$n);
 for($i=0;$i<count($n[0]);$i++){
  $key="{jskey_".$i."}";
  $nm="js_".$i;
  $str=str_replace($n[0][$i],$key,$str);
  $keys[$nm]="/$key/";
  $vals[$nm]=preg_replace("#/s*</!/-/-.*?[/r/n]#si","",$n[0][$i]);//去除<!--注释 $vals[$nm]=preg_replace("#/s*///*.*/*//#Usi","",$vals[$nm]);//先处理"/*..*/"这种类型的注释,如"/*..http://..*/",如果先处理"//.."这种类型的注释,则会变成/*...http:
  $vals[$nm]=preg_replace("#/s*.*?[/r/n]#si","",$vals[$nm]);//再处理"//"这种类型的注释
 }
 preg_match_all($reg,$str,$m);
 for($i=0;$i<count($m[0]);$i++){
  $key="{keys_".$i."}";
  $nm="tx_".$i;
  $str=str_replace($m[0][$i],$key,$str);
  $keys[$nm]="/$key/";
  $vals[$nm]=preg_replace("//r/n/","&#13;",$m[0][$i]);
  //在HTML里,一个换行在代码中是先/r,再/n的。先换行后回车的,连着的?
 }
 $str=preg_replace($h_reg,"",$str);
 $str=preg_replace($keys,$vals,$str);
 $str=preg_replace("//s+/si"," ",$str);
 //去除多余空格
    $isUnSpace = array ("div", "td", "tr", "table", "body", "link", "script", "style", "title", "meta", "head", "html");
foreach ($isUnSpace as $unSpace) {
 $reg_Cs1="/ +(<" . $unSpace . ")/si";
 $reg_Cs2="/ +(<//" . $unSpace . ")/si";
 $str=preg_replace($reg_Cs1,"//1",$str);
 $str=preg_replace($reg_Cs2,"//1",$str);
}
 return  $str;
}
 function ph($str){
  print $this->htmlc($this->subst($str));
 }
/*------------------------------------------------*/
    function msg($str){
  print $str;
 }
 function p($str){
  print $this->subst($str);
 }
}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值