php手把手教你做网站(三十五)网站静态生成三实战标签的实现
前边介绍了,preg_match_all,preg_match以及用到的标签,下面我们来以具体的实例来说明标签的解析。
模板news.html包含了include标签(通用头部,底部);//imgq7.q578.com/ef/0112/cded5b4fa5cdd838.jpg"fcname":"getpicpath"} 获取banner图;2个cmlist,第一个获取所有新闻的分类,第2个显示文章列表(带分页)2个cmlist是否有分页以pagesize区别;显示日期使用了自定义方法(riqigeshi),显示日期格式;
每一个标签解析的方式都是一样的,就是使用preg_match_all,代码比较多,大多是重复的,只贴出来一部分吧,参考下就可以按照自己的方式来写了。
注意:生成详细页面的时候,有的时候会同时生成列表页,要限制一下总的页数,最多生成前边多少页,如果页数很多,直接循环生成,很大可能会出现卡死的情况{include include/header}
{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=""; return $pagstr; }
有哪些极简主义的双肩包?极简主义的双肩包不是舍弃一切回归朴素,而是没有多余的摆设,只保留不可或缺的东西,没有杂念,于是有了双肩包至简单的境界。日常生活和学习工作中不同双肩包结构各异,其中极简主义的双肩包带
京东叠蛋糕活动的背后,还是道德的沦丧,还是人性的扭曲?因为习惯性地在电商平台购物,早早就注意到了618京东叠蛋糕活动,看了下游戏规则每天通过浏览店铺和会场领金币,通过组队进行PK,通过拉好友助力增加蛋糕层数,熟悉的配方,熟悉的感觉,这
科目三应该这么考!肯定能通过一考试学员在考试地点听到科三考试安全员喊到自己姓名时,学员走到车左前门,打开左前门上车,将身份证递给副驾驶位置科三考试安全员,进行视频认证。双手握住方向盘,左手在9点到10点之间,
缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值
买了车以后你们都知道了什么事?一有车以后能找到美眉的概率会大大增加,你的生活圈子里面,自己有车又独自一人生活的男人,是不是少之又少啊?我特意在这个问题上仔细的烟酒了一番。确定了两个根本原因,1能否找到美眉,自信
如何看待淘特持续霸榜苹果AppStore,老对手拼多多下滑出前十?电商平台竞争的核心命题是如何实现消费者的需求价值,所以满足购物需要才是根本。谁谁在榜上啊谁谁有流量其实没那么重要。不过这个淘特之所以能霸榜,也不是平白无故的,肯定是被消费者认可了才
芯片持续短缺,iPhone13将减产1000万部,这将产生哪些后续影响?2021年收到芯片短缺的问题,iPhone13系列直接减产1000万部,这或许对于苹果来说白在国内市场搞加量还减价的策略了,无法堵死国产高端机的道路。iPhone13系列的发布,在
英伟达到底能不能成功收购ARM?昨日(6月30日),AMD350亿美金收购赛灵思已经获得英国批准,那么,英伟达400亿美金收购Arm已经历经了快一年,其结局将如何呢?ARM被收购的历程自从移动终端兴起,ARM这些
书上的历史以前发生的事再以后的日子里被不断的否定我们不知道前人当时生活但没有记录下来的事情到底是怎样的通过留下的只言片语,仅存的一些器物,猜想着整个事情的经过。然而,总有一部分对不上,然后就
妊娠期如何计算胎儿的体重准爸爸准妈妈是不是为了想知道宝宝现在多重,在焦急等待时间里,可以利用一些数据进行推算胎儿体重,为此我看网上看一堆在妊娠期内计算胎儿的体重,特点就是比较凌乱,为此这里我自己整理一番,
我的周末是怎么过的?首先周末不是双休,而是妥妥的单休。没什么爱好,或者说适合一个人的爱好。所以周末就是一个人在家睡觉或者看小说。没有其他的。偶尔有朋友周末刚好也没事,离得也不远,就小聚一下。不玩游戏,