优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2024-11-23 20:20:23 技术文章 7 ℃

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

模板news.html

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

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

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

{include include/header}
	<div class="banner"><img src="{cmf 2|"fcname":"getpicpath"}" alt='新闻中心banner' /></div>
	<div class="navlist">
		<div class="wrapper">
			<div class="navlist-left"><ul>
			    {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"}
				<li><a href="/{fa cat_html_path}/{f a.cat_html_name}.html"  >{fa cat_name}</a></li>
	        {/cmlist}
			</ul>
			</div>
			<div class="navlist-right">
				<span class="bread-s0">位置:</span>
				<a href="/" class="bread-a">首页</a>><a href="/news/" class="bread-a">新闻资讯</a>
			</div>
		</div>
	</div>
	
	<div class="pd80">
		<div class="wrapper">
			<div class="news"><ul>
			 {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"}
				<li><a href="/{fa htmlfolder}/{fa htmlname}.html">
					<div class="addtime">{fa add_time|"fcname":"riqigeshi","methstr":"1"}</div>
					<div class="newsfont">
						<h2>{fa news_name}</h2>
						<div class="homedesc">{fa news_status}</div>
					</div>
					<div class="newsmore">查看详细</div>
					<div class="c"></div>
				</a></li>
				{/cmlist}
			</ul></div>
			<!-- 分页开始 -->
			<div class="c"></div>
				<div class="propage">{page}</div>
			<!-- 分页结束 --> 
			
		</div>
	</div>
	<div class="c"></div>
{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=\think\config::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='<ul class="pagination">';
	$totalpagt=10;
	$cat_html_path="";
	if($upapr['cat_html_path']){
	    $cat_html_path="/".$upapr['cat_html_path'];
	}

	if($ipage==1){
		$pagstr.="<li class=\"disabled\"><span><</span></li>";
	}else{

		$pagstr.="<li><a href=\"".$cat_html_path."/".$upapr['cat_html_name'].".html\"><</a></li>";
	}

    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.="<li class=\"active\" ><a href=\"".$cat_html_path."/".$cat_html_name.".html\" >".$is."</a></li>";
		}else{
		    $pagstr.="<li><a href=\"".$cat_html_path."/".$cat_html_name.".html\">".$is."</a></li>";
		}
	}

	if($ipage==$pagecount){
		$pagstr.="<li class=\"disabled\"><span>></span></li>";
	}else{
	    $pagstr.="<li><span><a href=\"".$cat_html_path."/".$upapr['cat_html_name']."_".$pagecount.".html\">></a></span></li>";
	}
	$pagstr.="</ul>";
    return $pagstr;
}

Tags:

最近发表
标签列表