范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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} 	"新闻中心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; }

手机怎么投屏在电视上?手机投屏电视主要有无线和有线两种方式,先来说说无线方式一无线连接使用无线连接方式首先要保证电视是智能电视,另外手机和电视需要要保持在同一个WiFi网络状态下,苹果和安卓设备略有不同华为集团和麻地梁煤矿有个约定内蒙古鄂尔多斯高原东南部,名不见经传的麻地梁静静地躺在黄土高坡的丘陵沟壑间。3年前,一家智能煤矿的横空出世打破了这里的沉寂,一支神秘团队的频频来访,更是让这里成为外界关注的焦点。华Vivo新机已入网,首发骁龙898,小米12及三星S22都将无缘首发?在刚刚过去的9月份中,要说最受欢迎的旗舰手机,非iPhone13莫属,自iPhone13发布后,各大手机厂商并未再发布自家旗舰机型,仅有部分中端机型发布。能够与苹果对抗的仅有华为,大数据和创构认识论作者王天恩(上海大学马克思主义学院社会科学学部教授,博士生导师)内容提要新一代人工智能的发展,在更深层次展示了大数据的重要性。正是在大数据基础上,汇聚了信息科技发展过程中生发的新认对于摄影爱好者来说,有一部单反相机是一种什么感觉?如果仅仅是爱好者,拥有了单反相机后,第一感觉是怎么拍不出人家拍的那样好的照片!第二是怀疑自己以前就是拍照的,从来没有搞过摄影!第三就是刚入手先用P档拍摄,因为不用P档玩不转!大笑大为什么人死之后不能用指纹解锁?有什么科学依据?不一定,看是什么样的设备。基本上,越高端越先进的设备,人死了越久,就越难解锁。人死后,其实指纹也是会有变化的。我们都知道,人死后,会在10分钟8小时内出现尸僵,经46小时扩散到全身大屏时代,iPodtouch承载着遗憾看见标题,就可以猜到,笔者是一个小屏狂热爱好者。是的,笔者目前正在使用的设备是魅族18,2021年第一批小屏产品,它的性能也还算不错,性能就不再细说,毕竟同样外观的18s已经上市。英特尔酷睿i912900处理器出现,与华硕ROGMaximusZ690Extreme主板搭配经过一段时间各方持续的消息泄露,普遍对首发阵容中带K和KF后缀的第12代酷睿系列处理器比较熟悉了,而其余AlderLakeS处理器的消息并不多,这些TDP为65W的产品反而是未来英iPhone13Pro上手评测4大亮点值得选择,不过仍有一些遗憾为了验证等了一年的十三香到底值不值,教授抢到了第一批iPhone13Pro的预购,在今天也是终于收到了货,经过一整天的体验,给出一些真实的感受供大家参考。知道你们有些人还在犹豫,看乐视S1新机开卖100全国产1599元两天前发布的乐视手机S1终于在今天正式开售。该机是乐视继2017年之后再次涉足手机领域,官方称它为是一台100全国产的手机。它搭载了一块6。53英寸的LCD直屏屏幕,水滴屏设计,分火爆科技圈的元宇宙真的是新风口吗?来源通信信息报社(记者陈锦锋)近期,元宇宙一词火爆科技圈。今年3月,元宇宙概念第一股罗布乐思(Roblox)在美国纽约证券交易所正式上市5月,Facebook表示将在5年内转型成一
有哪些极简主义的双肩包?极简主义的双肩包不是舍弃一切回归朴素,而是没有多余的摆设,只保留不可或缺的东西,没有杂念,于是有了双肩包至简单的境界。日常生活和学习工作中不同双肩包结构各异,其中极简主义的双肩包带京东叠蛋糕活动的背后,还是道德的沦丧,还是人性的扭曲?因为习惯性地在电商平台购物,早早就注意到了618京东叠蛋糕活动,看了下游戏规则每天通过浏览店铺和会场领金币,通过组队进行PK,通过拉好友助力增加蛋糕层数,熟悉的配方,熟悉的感觉,这科目三应该这么考!肯定能通过一考试学员在考试地点听到科三考试安全员喊到自己姓名时,学员走到车左前门,打开左前门上车,将身份证递给副驾驶位置科三考试安全员,进行视频认证。双手握住方向盘,左手在9点到10点之间,缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值得欣赏!拍摄于水族馆缤纷绚丽的观赏鱼,千姿百态,值买了车以后你们都知道了什么事?一有车以后能找到美眉的概率会大大增加,你的生活圈子里面,自己有车又独自一人生活的男人,是不是少之又少啊?我特意在这个问题上仔细的烟酒了一番。确定了两个根本原因,1能否找到美眉,自信如何看待淘特持续霸榜苹果AppStore,老对手拼多多下滑出前十?电商平台竞争的核心命题是如何实现消费者的需求价值,所以满足购物需要才是根本。谁谁在榜上啊谁谁有流量其实没那么重要。不过这个淘特之所以能霸榜,也不是平白无故的,肯定是被消费者认可了才芯片持续短缺,iPhone13将减产1000万部,这将产生哪些后续影响?2021年收到芯片短缺的问题,iPhone13系列直接减产1000万部,这或许对于苹果来说白在国内市场搞加量还减价的策略了,无法堵死国产高端机的道路。iPhone13系列的发布,在英伟达到底能不能成功收购ARM?昨日(6月30日),AMD350亿美金收购赛灵思已经获得英国批准,那么,英伟达400亿美金收购Arm已经历经了快一年,其结局将如何呢?ARM被收购的历程自从移动终端兴起,ARM这些书上的历史以前发生的事再以后的日子里被不断的否定我们不知道前人当时生活但没有记录下来的事情到底是怎样的通过留下的只言片语,仅存的一些器物,猜想着整个事情的经过。然而,总有一部分对不上,然后就妊娠期如何计算胎儿的体重准爸爸准妈妈是不是为了想知道宝宝现在多重,在焦急等待时间里,可以利用一些数据进行推算胎儿体重,为此我看网上看一堆在妊娠期内计算胎儿的体重,特点就是比较凌乱,为此这里我自己整理一番,我的周末是怎么过的?首先周末不是双休,而是妥妥的单休。没什么爱好,或者说适合一个人的爱好。所以周末就是一个人在家睡觉或者看小说。没有其他的。偶尔有朋友周末刚好也没事,离得也不远,就小聚一下。不玩游戏,