前边介绍了,pregmatchall,pregmatch以及用到的标签,下面我们来以具体的实例来说明标签的解析。 模板news。html包含了include标签(通用头部,底部);img01。bs178。combalucded5b4fa5cdd838。jpgfcname:getpicpath}获取banner图;2个cmlist,第一个获取所有新闻的分类,第2个显示文章列表(带分页)2个cmlist是否有分页以pagesize区别;显示日期使用了自定义方法(riqigeshi),显示日期格式; 每一个标签解析的方式都是一样的,就是使用pregmatchall,代码比较多,大多是重复的,只贴出来一部分吧,参考下就可以按照自己的方式来写了。 注意:生成详细页面的时候,有的时候会同时生成列表页,要限制一下总的页数,最多生成前边多少页,如果页数很多,直接循环生成,很大可能会出现卡死的情况{includeincludeheader}imgsrca2020imgdataimg。jpgdatasrcimg01。bs178。combalucded5b4fa5cdd838。jpgfcname:getpicpath}alt新闻中心bannerul{cmlistt:webcat,f:catname,id,cathtmlname,cathtmlpath,c:projectid87andparentid0,o:sortdesc,iddesc,l:,name:a}li{facatname}li{cmlist}ulspanclassbreads0位置:span首页新闻资讯ul{cmlistt:webnews,f:addtime,newsname,id,newsstatus,newspic,htmlname,htmlfolder,c:,o:sortdesc,iddesc,l:,name:a,pagesize:10}li{faaddtimefcname:riqigeshi,methstr:1}h2{fanewsname}h2{fanewsstatus}查看详细li{cmlist}ul!分页开始{page}!分页结束{includeincludefooter} 创建htmlfunction()用于生成html页面模板名称htmlnamenews。添加或者编辑文章,保存以后的信息upaprDb::name();functionhtmlfunction(htmlname,upapr){1读取模板htmstrfilegetcontents(htmlname);2替换include标签htmstrincfunction(htmstr);3替换掉详情页的编号pregmatch(cs〔(。)〕i,htmstr,carr);carr〔0〕:cs〔id〕carr〔1〕:idif(carr){htmstrstrreplace(carr〔0〕,upapr〔carr〔1〕〕,htmstr);}4替换掉配置的路径信息replacstrhinkconfig::get(viewreplacestr);可以单个的替换htmstrstrreplace(PUJS,replacstr〔PUJS〕,htmstr);htmstrstrreplace(PUCSS,replacstr〔PUCSS〕,htmstr);htmstrstrreplace(PUIMG,replacstr〔PUIMG〕,htmstr);也可以循环数组,1次性全部替换foreach(replacstraskv){htmstrstrreplace(k,v,htmstr);}5替换cmf标签(自定义函数)htmstrcmffunction(htmstr);6替换cmonehtmstrcmonefunction(htmstr);7替换cmpagehtmstrcmpage(htmstr);8替换嵌套循环都用到cmlist标签,防止出错,嵌套循环放到前边替换htmstrloopcatfunction(htmstr);9替换模块内循环分页会涉及到分页的时候页码链接地址(存放的文件、文件名称),还有列表链接文章详情upaprarray();存放这些信息funcstrloopfunction(htmstr,upapr);htmstrfuncstr〔htmstr〕;upaprfuncstr〔upapr〕??} incfunction函数,替换include文件functionincfunction(htmstr){pregmatchall({include(。)}i,htmstr,includearr);cinfodb(config)field(sitetheme)find();cinfo〔sitetheme〕defaulti0;foreach(includearr〔1〕ask){读取模板信息kincludeheader截取出来的k带有空格需要trim(k)去掉ROOTPATHE:webincludearr〔0〕〔m〕{includeincludeheader}htmstrstrreplace(includearr〔0〕〔i〕,filegetcontents(Config(webtemplate。viewpath)。cinfo〔sitetheme〕。。trim(k)。。html),htmstr);i;}} cmffunction函数,替换自定义函数functioncmffunction(htmlstr){pregmatchall({cmf(。?)}is,htmlstr,arr);ii0;foreach(arr〔1〕asmeth){metharrexplode(,meth);fcnamejsondecode({。metharr〔1〕。})methstrjsondecode({。metharr〔1〕。})methstr??;htmlstrstrreplace(arr〔0〕〔ii〕,fcname(trim(metharr〔0〕),methstr),htmlstr);}} cmone函数,替换单页信息functioncmonefunction(htmlstr){pregmatchall({cmone(。?)}(。?){cmone}is,htmlstr,listone);m0;listone〔0〕原字符串listone〔1〕标签内的参数listone〔2〕替换的字符串foreach(listone〔1〕ask5){ttrim(jsondecode({。k5。})t);ftrim(jsondecode({。k5。})f);otrim(jsondecode({。k5。})o);ctrim(jsondecode({。k5。})c??);ltrim(jsondecode({。k5。})l??);nametrim(jsondecode({。k5。})name??);nameDb(t)field(f)where(c)order(o)limit(l)find();截取字段pregmatchall({f。name。(。?)}is,listone〔2〕〔m〕,farr);farr〔1〕字段存放的数组,字段带有空格要trim()删除pregstrlistone〔2〕〔m〕;finum0;foreach(farr〔1〕asfi){ffarrexplode(,fi);判断是否存在自定义函数if(count(ffarr)1){fcnamejsondecode({。ffarr〔1〕。})methstrjsondecode({。ffarr〔1〕。})methstr??;fiarexplode(,,ffarr〔0〕);可以是多个变量,合并成了字符串for(c0;ccount(fiar)1;c){fistr。name〔trim(fiar〔c〕)〕。,;}左侧参数fistr右侧常量参数methstrfistrmbsubstr(fistr,0,mbstrlen(fistr)1);pregstrstrreplace(farr〔0〕〔finum〕,fcname(fistr,methstr),pregstr);}else{pregstrstrreplace(farr〔0〕〔finum〕,name〔trim(farr〔1〕〔finum〕)〕,pregstr);}}htmlstrstrreplace(listone〔0〕〔m〕,pregstr,htmlstr);m;}} cmpage函数,替换单页信息 整个模板应该只会出现一次,使用pregmatch即可。functioncmpage(htmstr){整个页面替换字段,执行完成以后要清除掉cmpage标签pregreplace({cmpage(。)},,htmstr);pregmatch({cmpage(。)},htmstr,pagearr);if(pagearr){ttrim(jsondecode({。pagearr〔1〕。})t);ftrim(jsondecode({。pagearr〔1〕。})f);otrim(jsondecode({。pagearr〔1〕。})o);ctrim(jsondecode({。pagearr〔1〕。})c??);ltrim(jsondecode({。pagearr〔1〕。})l??);nametrim(jsondecode({。pagearr〔1〕。})name??);namedb(t)field(f)where(c)order(o)limit(l)find();pregmatchall({f。name。(。?)}is,htmstr,fuearr);finum0;foreach(fuearr〔1〕asfi){ffarrexplode(,fi);if(count(ffarr)1){fcnamejsondecode({。ffarr〔1〕。})methstrjsondecode({。ffarr〔1〕。})methstr??;fiarexplode(,,ffarr〔0〕);可以是多个变量,合并成了字符串for(c0;ccount(fiar)1;c){fistr。name〔trim(fiar〔c〕)〕。,;}左侧参数fistr右侧常量参数methstrfistrmbsubstr(fistr,0,mbstrlen(fistr)1);htmstrstrreplace(fuearr〔0〕〔finum〕,fcname(fistr,methstr),htmstr);}else{htmstrstrreplace(fuearr〔0〕〔finum〕,name〔trim(fuearr〔1〕〔finum〕)〕,htmstr);};}}htmstrpregreplace({cmpage(。)},,htmstr);} loopfunction函数,模块内循环,分页循环functionloopfunction(htmstr,upaprarray()){pregmatchall({cmlist(。?)}(。?){cmlist}is,htmstr,listarr);li0;foreach(listarr〔0〕askloop){pregmatch({。}U,kloop,marr);nametrim(jsondecode({。listarr〔1〕〔li〕。})name);ttrim(jsondecode({。listarr〔1〕〔li〕。})t);ftrim(jsondecode({。listarr〔1〕〔li〕。})f);otrim(jsondecode({。listarr〔1〕〔li〕。})o);ctrim(jsondecode({。listarr〔1〕〔li〕。})c??);ltrim(jsondecode({。listarr〔1〕〔li〕。})l??);pagesizetrim(jsondecode({。listarr〔1〕〔li〕。})pagesize??);if(pagesize){acountdb(t)field(f)where(c)count(1);pagecountceil(acountpagesize);if(pagecount0){pagecount1;}ipageupapr〔ipage〕;pagepagefunction(pagesize,pagecount,upapr,ipage);upapr〔pagecount〕empty(upapr〔pagecount〕)?pagecount:(int)upapr〔pagecount〕;if(pagecountupapr〔pagecount〕){upapr〔pagecount〕}if(upapr〔pagecount〕1){upapr〔page〕}adb(t)field(f)where(c)order(o)page(ipage,pagesize)select();htmstrstrreplace({page},page,htmstr);}else{adb(t)field(f)where(c)order(o)limit(l)select();}key1;foreach(aasname){name〔key〕hs。blockfunction(listarr〔2〕〔li〕,name,key,name);}htmstrstrreplace(listarr〔0〕〔li〕,hs,htmstr);arraysplice(a,0,count(a));}returnarray(htmstrhtmstr,upaprupapr);} blockfunction函数,替换循环字段functionblockfunction(pregstr,name,key,mdname){pregmatchall({f。mdname。(。?)}is,pregstr,fuearr);finum0;foreach(fuearr〔1〕asfi){ffarrexplode(,fi);if(count(ffarr)1){fcnametrim(jsondecode({。ffarr〔1〕。})fcname);methstrtrim(jsondecode({。ffarr〔1〕。})methstr??);fiarexplode(,,ffarr〔0〕);可以是多个变量,合并成了字符串for(c0;ccount(fiar)1;c){fistr。name〔trim(fiar〔c〕)〕。,;}左侧参数fistr右侧常量参数methstrfistrmbsubstr(fistr,0,mbstrlen(fistr)1);pregstrstrreplace(fuearr〔0〕〔finum〕,fcname(fistr,methstr),pregstr);}else{pregstrstrreplace(fuearr〔0〕〔finum〕,name〔trim(fuearr〔1〕〔finum〕)〕,pregstr);};pregstrstrreplace({key},key,pregstr);}} loopcatfunction嵌套循环functionloopcatfunction(htmstr){pregmatchall({cmbox}(。?){cmbox}is,htmstr,listarr);li0;foreach(listarr〔1〕askcat){pregstrcheckcatfunction(kcat);htmstrstrreplace(listarr〔0〕〔li〕,pregstr,htmstr);}} checkcatfunction嵌套循环functioncheckcatfunction(hsstr){获取结束标志pregmatch({cmlist(。)}i,hsstr,marr);enptrim(jsondecode({。marr〔1〕。})enp??cmlist);pregmatchall({cmlist(。?)}(。?){。enp。}is,hsstr,listarr);k0;foreach(listarr〔1〕assm){ttrim(jsondecode({。sm。})t);ftrim(jsondecode({。sm。})f);otrim(jsondecode({。sm。})o);ctrim(jsondecode({。sm。})c??);ltrim(jsondecode({。sm。})l??);nametrim(jsondecode({。sm。})name);adb(t)field(f)where(c)order(o)limit(l)select();key1;foreach(aasname){hs。blockfunction(listarr〔2〕〔k〕,name,key,name);替换参数pregmatch(。name。〔(。?)〕i,listarr〔2〕〔k〕,csarr);if(csarr){hsstrreplace(csarr〔0〕,name〔csarr〔1〕〕,hs);}}hsstrstrreplace(listarr〔0〕〔k〕,hs,hsstr);k;}if(pregmatch({cmlist(。)}i,hsstr,isrr)){returncheckcatfunction(hsstr);}} pagefunction函数,分页函数functionpagefunction(pagesize,pagecount,upapr,ipage){totalpagt10;if(upapr〔cathtmlpath〕){cathtmlpath。upapr〔cathtmlpath〕;}if(ipage1){pagstr。}else{pagstr。}if(ipage5){startsp1;if(pagecounttotalpagt){}else{}}else{if(pagecounttotalpagt){startsp1;}else{endspipage5;startspipage4;if(ipagepagecount5){startspipage(totalpagt(pagecountipage))1;}}}for(is){if(is1){cathtmlnameupapr〔cathtmlname〕;}else{cathtmlnameupapr〔cathtmlname〕。。}if((int)ipage(int)is){pagstr。liclassactive。is。}else{pagstr。li。is。}}if(ipagepagecount){pagstr。}else{pagstr。}pagstr。}