php手把手教你做网站(三十五)网站静态生成三实战标签的实现

前边介绍了,preg_match_all,preg_match以及用到的标签,下面我们来以具体的实例来说明标签的解析。

模板news.html

  1. 包含了include标签(通用头部,底部);
  2. //img01.bs178.com/ba/lu/cded5b4fa5cdd838.jpg"fcname":"getpicpath"} 获取banner图;
  3. 2个cmlist,第一个获取所有新闻的分类,第2个显示文章列表(带分页)2个cmlist是否有分页以pagesize区别;
  4. 显示日期使用了自定义方法(riqigeshi),显示日期格式;

每一个标签解析的方式都是一样的,就是使用preg_match_all,代码比较多,大多是重复的,只贴出来一部分吧,参考下就可以按照自己的方式来写了。

注意:生成详细页面的时候,有的时候会同时生成列表页,要限制一下总的页数,最多生成前边多少页,如果页数很多,直接循环生成,很大可能会出现卡死的情况

{include include/header}
	新闻中心banner
	
		
			
    {cmlist "t":"web_cat","f":"cat_name,id,cat_html_name,cat_html_path","c":"projectid=87 and parentid=0","o":"sort desc,id desc","l":"","name":"a"}
  • {fa cat_name}
  • {/cmlist}
位置: 首页>新闻资讯
    {cmlist "t":"web_news","f":"add_time,news_name,id,news_status,news_pic,htmlname,htmlfolder","c":"","o":"sort desc,id desc","l":"","name":"a","pagesize":"10"}
  • {fa add_time|"fcname":"riqigeshi","methstr":"1"}

    {fa news_name}

    {fa news_status} 查看详细
  • {/cmlist}
{page} {include include/footer}

创建htmlfunction()用于生成html页面

//模板名称
$htmlname="news.html";
/*
     *添加或者编辑文章,保存以后的信息
     *$upapr=Db::name()->;
*/
$upapr='';
function htmlfunction($htmlname,$upapr){
    //1读取模板
    $htmstr=file_get_contents($htmlname);
    //2替换include标签
    $htmstr=incfunction($htmstr);
    //3替换掉详情页的编号
	  preg_match('/cs[(.*)]/i',$htmstr,$carr);
    //$carr[0]:cs[id]  $carr[1]:id 
	  if($carr){
	      $htmstr=str_replace($carr[0],$upapr[$carr[1]],$htmstr);
	  }
    //4替换掉配置的路径信息
    $replac_str=	hinkconfig::get('view_replace_str');
    //可以单个的替换
    $htmstr=str_replace('__PUJS__',$replac_str['__PUJS__'],$htmstr);
	  $htmstr=str_replace('__PUCSS__',$replac_str['__PUCSS__'],$htmstr);
	  $htmstr=str_replace('__PUIMG__',$replac_str['__PUIMG__'],$htmstr);
    //也可以循环数组,1次性全部替换
    /*
    foreach($replac_str as $k=>$v){
      $htmstr=str_replace($k,$v,$htmstr);
    }
    */
    //5替换 cmf标签(自定义函数)
    $htmstr=cmffunction($htmstr);
    //6  替换cmone
    $htmstr=cmonefunction($htmstr);
    //7  替换cmpage
    $htmstr=cmpage($htmstr);
    //8替换嵌套循环
    /*
         都用到cmlist标签,防止出错,嵌套循环放到前边替换
    */
    $htmstr=loopcatfunction($htmstr);
    //9  替换模块内循环  分页
    /*
       会涉及到分页的时候 页码链接地址(存放的文件、文件名称),还有列表链接文章详情
       $upapr=array();存放这些信息
    */
    $funcstr=loopfunction($htmstr,$upapr);
	  $htmstr=$funcstr['htmstr'];
	  $upapr=$funcstr['upapr']??$upapr;
    
  
    
    
   
}

incfunction函数,替换include文件

function incfunction($htmstr) {
    preg_match_all("/{include(.*)}/i",$htmstr,$includearr);
	//$cinfo=db('config')->field('site_theme')->find();
	$cinfo['site_theme']='default'
	$i=0;
	foreach($includearr[1] as $k){
    /*
      * 读取模板信息   $k  include/header 
      * 截取出来的 $k带有空格  需要trim($k)去掉
      * ROOT_PATH  E:web
      * $includearr[0][$m]  {include include/header}
    */
		$htmstr=str_replace($includearr[0][$i],file_get_contents(Config('webtemplate.view_path').$cinfo['site_theme']."/".trim($k).".html"),$htmstr);
		$i++;
	}
    return $htmstr;
}

cmffunction函数,替换自定义函数

function cmffunction($htmlstr) {
		preg_match_all("/{cmf(.*?)}/is",$htmlstr,$arr);
		$ii=0;
		foreach($arr[1] as $meth){
		  $metharr=explode("|",$meth);
			$fcname=json_decode("{".$metharr[1]."}")->$fcname;
			$methstr=json_decode("{".$metharr[1]."}")->methstr??'';
			$htmlstr=str_replace($arr[0][$ii],$fcname(trim($metharr[0]),$methstr),$htmlstr);
			$ii++;
		}
    return $htmlstr;
}

cmone函数,替换单页信息

function cmonefunction($htmlstr) {
	preg_match_all("/{cmone(.*?)}(.*?){/cmone}/is",$htmlstr,$listone);
  $m=0;
  /*
    * $listone[0] 原字符串  
    * $listone[1]  标签内的参数  
    * $listone[2] 替换的字符串
  */
	foreach($listone[1] as $k5){

		$t=trim(json_decode("{".$k5."}")->t);
		$f=trim(json_decode("{".$k5."}")->f);
		$o=trim(json_decode("{".$k5."}")->o);
		$c=trim(json_decode("{".$k5."}")->c??'');
		$l=trim(json_decode("{".$k5."}")->l??'');
		$name=trim(json_decode("{".$k5."}")->name??'');
		$name=Db($t)->field($f)->where($c)->order($o)->limit($l)->find();
    //截取字段
		preg_match_all('/{f'.$name.'(.*?)}/is',$listone[2][$m],$farr);
    //$farr[1]  字段存放的数组,字段带有空格要trim()删除
		$pregstr=$listone[2][$m];
		$finum=0;
		foreach($farr[1] as $fi){
	        $ffarr=explode("|",$fi);
      //判断是否存在自定义函数
		    if(count($ffarr)>1){
		        $fcname=json_decode("{".$ffarr[1]."}")->fcname;
		        $methstr=json_decode("{".$ffarr[1]."}")->methstr??'';

			    $fiar=explode(",",$ffarr[0]);
        //可以是多个变量,合并成了字符串
			    $fistr="";
			    for($c=0;$c<=count($fiar)-1;$c++){
				     $fistr.=$name[trim($fiar[$c])].","; 
			    }
        //左侧参数 $fistr  右侧常量参数$methstr
                $fistr=mb_substr($fistr,0,mb_strlen($fistr)-1);
			    $pregstr=str_replace($farr[0][$finum],$fcname($fistr,$methstr),$pregstr);
		    }else{
                $pregstr=str_replace($farr[0][$finum],$name[trim($farr[1][$finum])],$pregstr);
		    }
		    $finum++;
		}
		$htmlstr=str_replace($listone[0][$m],$pregstr,$htmlstr);
    $m++;
	}
	return $htmlstr;
}

cmpage函数,替换单页信息

整个模板应该只会出现一次,使用preg_match即可。

function cmpage($htmstr) {
  /*
	整个页面替换字段,
    执行完成以后  要清除掉cmpage标签
	preg_replace('/{cmpage(.*)}/','',$htmstr);

	*/
	preg_match('/{cmpage(.*)}/',$htmstr,$pagearr);
	if($pagearr){

		$t=trim(json_decode("{".$pagearr[1]."}")->t);
		$f=trim(json_decode("{".$pagearr[1]."}")->f);
		$o=trim(json_decode("{".$pagearr[1]."}")->o);
		$c=trim(json_decode("{".$pagearr[1]."}")->c??'');
		$l=trim(json_decode("{".$pagearr[1]."}")->l??'');
		$name=trim(json_decode("{".$pagearr[1]."}")->name??'');
		$name=db($t)->field($f)->where($c)->order($o)->limit($l)->find();

        preg_match_all('/{f'.$name.' (.*?)}/is',$htmstr,$fuearr);
		$finum=0;
		foreach($fuearr[1] as $fi){
			$ffarr=explode("|",$fi);
			if(count($ffarr)>1){
		        $fcname=json_decode("{".$ffarr[1]."}")->fcname;
		        $methstr=json_decode("{".$ffarr[1]."}")->methstr??'';

			    $fiar=explode(",",$ffarr[0]);
        //可以是多个变量,合并成了字符串
			    $fistr="";
			    for($c=0;$c<=count($fiar)-1;$c++){
				     $fistr.=$name[trim($fiar[$c])].","; 
			    }
        //左侧参数 $fistr  右侧常量参数$methstr
                $fistr=mb_substr($fistr,0,mb_strlen($fistr)-1);
			    $htmstr=str_replace($fuearr[0][$finum],$fcname($fistr,$methstr),$htmstr);

			}else{
				$htmstr=str_replace($fuearr[0][$finum],$name[trim($fuearr[1][$finum])],$htmstr);	
			};
			$finum++;		
		}
	}
  $htmstr=preg_replace('/{cmpage(.*)}/','',$htmstr);
	return $htmstr;
}

loopfunction函数,模块内循环,分页循环

function loopfunction($htmstr,$upapr=array()) {
	preg_match_all("/{cmlist(.*?)}(.*?){/cmlist}/is",$htmstr,$listarr);
	$li=0;

	foreach($listarr[0] as $kloop){
		//preg_match('/{.*}/U',$kloop,$marr);

		$name=trim(json_decode("{".$listarr[1][$li]."}")->name);
		$t=trim(json_decode("{".$listarr[1][$li]."}")->t);
		$f=trim(json_decode("{".$listarr[1][$li]."}")->f);
		$o=trim(json_decode("{".$listarr[1][$li]."}")->o);
		$c=trim(json_decode("{".$listarr[1][$li]."}")->c??'');
		$l=trim(json_decode("{".$listarr[1][$li]."}")->l??'');
		$pagesize=trim(json_decode("{".$listarr[1][$li]."}")->pagesize??'');

        if($pagesize){
			$acount=db($t)->field($f)->where($c)->count(1);
			$pagecount=ceil($acount/$pagesize);
			if( $pagecount==0){$pagecount=1;}
			$ipage=$upapr['ipage'];

			$page=pagefunction($pagesize,$pagecount,$upapr,$ipage);

			$upapr['pagecount']=empty($upapr['pagecount'])?$pagecount:(int)$upapr['pagecount'];
			if($pagecount<$upapr['pagecount']){
			    $upapr['pagecount']=$pagecount;	
			}
			if($upapr['pagecount']>1){
			    $upapr['page']=true;
			}
			
			
            $a=db($t)->field($f)->where($c)->order($o)->page($ipage,$pagesize)->select(); 
			$htmstr=str_replace("{page}",$page,$htmstr); 
		}else{
		    $a=db($t)->field($f)->where($c)->order($o)->limit($l)->select();
		}

        $hs="";
		$key=1;
		foreach($a as $name){
			$name['key']=$key;
            $hs.=blockfunction($listarr[2][$li],$name,$key,$name);
		    $key++;	
		}


		$htmstr=str_replace($listarr[0][$li],$hs,$htmstr);
		
		$li++;
		array_splice($a, 0, count($a));
	}
    return array("htmstr"=>$htmstr,'upapr'=>$upapr);
}

blockfunction函数,替换循环字段

function blockfunction($pregstr ,$name,$key,$mdname) {
	preg_match_all('/{f'.$mdname.' (.*?)}/is',$pregstr,$fuearr);
	$finum=0;
	foreach($fuearr[1] as $fi){
	    $ffarr=explode("|",$fi);
		if(count($ffarr)>1){
		        $fcname=trim(json_decode("{".$ffarr[1]."}")->fcname);
		        $methstr=trim(json_decode("{".$ffarr[1]."}")->methstr??'');

			    $fiar=explode(",",$ffarr[0]);
        //可以是多个变量,合并成了字符串
			    $fistr="";
			    for($c=0;$c<=count($fiar)-1;$c++){
				     $fistr.=$name[trim($fiar[$c])].","; 
			    }
        //左侧参数 $fistr  右侧常量参数$methstr
                $fistr=mb_substr($fistr,0,mb_strlen($fistr)-1);
			    $pregstr=str_replace($fuearr[0][$finum],$fcname($fistr,$methstr),$pregstr);
	    }else{

			$pregstr=str_replace($fuearr[0][$finum],$name[trim($fuearr[1][$finum])],$pregstr);
		};
		$pregstr=str_replace("{key}",$key,$pregstr);
		$finum++;
	}
	return $pregstr;
}

loopcatfunction嵌套循环

function loopcatfunction($htmstr) {
	preg_match_all("/{cmbox}(.*?){/cmbox}/is",$htmstr,$listarr);
	$li=0;
	$pregstr='';
	foreach($listarr[1] as $kcat){
		$pregstr=checkcatfunction($kcat);
		$htmstr=str_replace($listarr[0][$li],$pregstr,$htmstr);
		$li++;

    }
	
    return $htmstr;
}

checkcatfunction嵌套循环

function checkcatfunction($hsstr) {
	//获取结束标志
	preg_match('/{cmlist(.*)}/i',$hsstr,$marr);
	$enp=trim(json_decode("{".$marr[1]."}")->enp??'cmlist');
	preg_match_all("/{cmlist(.*?)}(.*?){/".$enp."}/is",$hsstr,$listarr);
	$k=0;
	foreach($listarr[1] as $sm){
	     $t=trim(json_decode("{".$sm."}")->t);
	     $f=trim(json_decode("{".$sm."}")->f);
	     $o=trim(json_decode("{".$sm."}")->o);
	     $c=trim(json_decode("{".$sm."}")->c??'');
	     $l=trim(json_decode("{".$sm."}")->l??'');
	     $name=trim(json_decode("{".$sm."}")->name);
		 $a=db($t)->field($f)->where($c)->order($o)->limit($l)->select();
		 $hs="";
		 $key=1;

		 foreach($a as $name){
			 $hs.=blockfunction($listarr[2][$k],$name,$key,$name);
			 //替换参数
			 preg_match('/'.$name.'[(.*?)]/i',$listarr[2][$k],$csarr);
			 if($csarr){
			     $hs=str_replace($csarr[0],$name[$csarr[1]],$hs);
			 }
			 $key++;
		 }
		 $hsstr=str_replace($listarr[0][$k],$hs,$hsstr);
		 $k++; 
	}
    if(preg_match('/{cmlist(.*)}/i',$hsstr,$isrr)){
	    return checkcatfunction($hsstr);
    }
    return $hsstr;
}

pagefunction函数,分页函数

function pagefunction($pagesize,$pagecount,$upapr,$ipage){
	$pagstr='
    '; $totalpagt=10; $cat_html_path=""; if($upapr['cat_html_path']){ $cat_html_path="/".$upapr['cat_html_path']; } if($ipage==1){ $pagstr.="
  • <
  • "; }else{ $pagstr.="
  • <
  • "; } if($ipage<=5){ $startsp=1; if($pagecount<=$totalpagt){ $endsp=$pagecount; }else{ $endsp=$totalpagt; } }else{ if($pagecount<=$totalpagt){ $endsp=$pagecount; $startsp=1; }else{ $endsp=$ipage+5; $startsp=$ipage-4; if($ipage>$pagecount-5){ $endsp=$pagecount; $startsp=$ipage-($totalpagt-($pagecount-$ipage))+1; } } } for($is=$startsp;$is<=$endsp;$is++){ if($is==1){ $cat_html_name=$upapr['cat_html_name']; }else{ $cat_html_name=$upapr['cat_html_name']."_".$is; } if((int)$ipage==(int)$is){ $pagstr.="
  • ".$is."
  • "; }else{ $pagstr.="
  • ".$is."
  • "; } } if($ipage==$pagecount){ $pagstr.="
  • >
  • "; }else{ $pagstr.="
  • >
  • "; } $pagstr.="
"; return $pagstr; }
展开阅读全文

页面更新:2024-03-08

标签:标签   嵌套   手把手   数组   字段   空格   字符串   变量   静态   函数   实战   模板   网站   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top