前边介绍了,preg_match_all,preg_match以及用到的标签,下面我们来以具体的实例来说明标签的解析,下面我们就来聊聊关于怎么用php制作静态网页?接下来我们就一起去了解一下吧!

怎么用php制作静态网页(php手把手教你做网站)

怎么用php制作静态网页

前边介绍了,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; }

,