前边介绍了,preg_match_all,preg_match以及用到的标签,下面我们来以具体的实例来说明标签的解析,下面我们就来聊聊关于怎么用php制作静态网页?接下来我们就一起去了解一下吧!
怎么用php制作静态网页
前边介绍了,preg_match_all,preg_match以及用到的标签,下面我们来以具体的实例来说明标签的解析。
模板news.html
- 包含了include标签(通用头部,底部);
- {cmf 2|"fcname":"getpicpath"} 获取banner图;
- 2个cmlist,第一个获取所有新闻的分类,第2个显示文章列表(带分页)2个cmlist是否有分页以pagesize区别;
- 显示日期使用了自定义方法(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;
}