Posted in PHP onAugust 21, 2010
html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> {t:arc row='10'} {t:field.title/} {t:list row='5'} {t:field.title/} {t:list row='5'} {t:field.title/} {/t:list}{t:field.title/} {/t:list}{t:field.title/} {/t:arc} {T:channelartlist row='6' } <dl> <dt>{t:field name='typename'/}{t:field.typename/}</dt> <dd> {t:arclist titlelen='42' row='10'} <ul class='autod'> <li>[field:title/]</li> <li>([field:sendtime function="MyDate('m-d',@me)"/])</li> </ul> {/t:arclist} </dl>{/t:channelartlist } {t:global.cfg_title /}{t:var.cfg_title/}{t:global.cfg_webname /}{t:global.cfg_title/}{t:var.cfg_title/} {t:field.title function="Html2Text(@me)"/} {t:include filename="header.htm"/} {t:include filename="header.htm" /} {t:field.title function='Html2Text(@me)' }{/t:field } {t:array name='asdas' }{/t:array } {t:channel typeid='1' row='15'} [field:id/][field:typename/] {/t:channel } {t:channel typeid='1'} [field:id/] [field:typename/]{/t:channel} {t:channel typeid='1' }[field:id/] [field:typename/]{/t:channel }sd {t:channel}[field:typename/]{/t:channel } {t:channel typeid='1' row='20' }[field:userid/] [field:scores/] {/t:channel } </body> </html>
php代码
<?php $str = file_get_contents("test.htm"); $skstr="{"; $skdstr="t:"; $sdstr="}"; //$reg="/{t:.*?(?:\/).*?}/si";//此无法匹配嵌套,只能一层 si s: 使前面的. 包括换行符 i:不区分大小写 //$reg="/({t:*[^{]*\/}|{t:*[^}]*}([^{]|(?R))*{\/t:.*?})/si";无限嵌套都可截取. $reg='/('.$skstr.$skdstr.'*[^'.$skstr.']*\/'.$sdstr.'|'.$skstr.$skdstr.'*[^'.$sdstr.']*'.$sdstr.'([^'.$skstr.']|(?R))*'.$skstr.'\/'.$skdstr.'.*?'.$sdstr.')/si'; preg_match_all($reg,$str,$m); /*echo "<pre>";print_r($m[0]);echo "</pre>";exit();*/ $CTags=array(); $glarr1=array($skstr.$skdstr=>'');//array('{t:'=>'');前缀 $glarr2=array('"'=>'','\''=>'','$'=>'','/'=>''); /* {t:array typeid='1'}[field:typename/]{/t:array} {t:global.title function="html2text(@me)"/} */ foreach($m[0] as $k=>$v){ $rarr=array(); $rarr['str']=$v; //原模板字符串 $vs=explode('}',$v); //分割取得第一部分 {t:array typeid='1' $va=explode(' ',$vs[0]); //分割属性 " {t:array " , " typeid='1' " $vb=explode('.',$va[0]); //分割标签名和字段名 {t:global.title $rarr['tagname']=trim(strtr(strtolower($vb[0]),$glarr1));//过滤前缀{t: 取得标签名 array 或 golbal $rarr['tagfield']=strtr($vb[1],$glarr2); //取得字段名 title unset($vs[0]);$vsstr=implode('}',$vs); //去掉前缀,返回后半段: [field:typename/]{/t:array} $rarr['text']=preg_replace("/".$skstr."\/".$skdstr.$rarr['tagname']."(.*?)".$sdstr."/si",'',$vsstr); /*过滤后缀 {/t:array} 取得中间文本. 可能出现,空格或者换行所以使用正则,也可直接使用strtr 替换 。 {/t:array } {/t:array } strtr(strtolower($vsstr),array($skstr.'/'.$skdstr.$rarr['tagname'].$sdstr=>'')); */ unset($va[0]); $attr=array(); foreach($va as $val){//循环记录属性 $val=strtr($val,$glarr2); //typeid='1' 去掉 " ' / , typeid=1 $vc=explode('=',$val); if(!empty($vc[0])){ $vc[0]=strtolower($vc[0]); //小写属性名 if($vc[0]=="function"){ $rarr['function']=$vc[1]; //返回要执行的 html2text(@me) }else if($vc[0]=="name"){ $rarr['tagfield']=$vc[1]; //{t:field name='title' /} }else{ $attr[trim($vc[0])]=$vc[1]; //属性 $attr['typeid']=1; } } } $rarr['attr']=$attr; $CTags[$k]=$rarr; } echo "<pre>"; print_r($CTags); echo "</pre>"; ?>
输出内容:
Array ( [0] => Array ( [str] => {t:arc row='10'} {t:field.title/} {t:list row='5'} {t:field.title/} {t:list row='5'} {t:field.title/} {/t:list}{t:field.title/} {/t:list}{t:field.title/} {/t:arc} [tagname] => arc [tagfield] => [text] => {t:field.title/} {t:list row='5'} {t:field.title/} {t:list row='5'} {t:field.title/} {/t:list}{t:field.title/} {/t:list}{t:field.title/} [attr] => Array ( [row] => 10 ) ) [1] => Array ( [str] => {T:channelartlist row='6' } {t:field name='typename'/}{t:field.typename/} {t:arclist titlelen='42' row='10'} [field:title/] ([field:sendtime function="MyDate('m-d',@me)"/]) {/t:arclist} {/t:channelartlist } [tagname] => channelartlist [tagfield] => [text] => {t:field name='typename'/}{t:field.typename/} {t:arclist titlelen='42' row='10'} [field:title/] ([field:sendtime function="MyDate('m-d',@me)"/]) {/t:arclist} [attr] => Array ( [row] => 6 ) ) [2] => Array ( [str] => {t:global.cfg_title /} [tagname] => global [tagfield] => cfg_title [text] => [attr] => Array ( ) ) [3] => Array ( [str] => {t:var.cfg_title/} [tagname] => var [tagfield] => cfg_title [text] => [attr] => Array ( ) ) [4] => Array ( [str] => {t:global.cfg_webname /} [tagname] => global [tagfield] => cfg_webname [text] => [attr] => Array ( ) ) [5] => Array ( [str] => {t:global.cfg_title/} [tagname] => global [tagfield] => cfg_title [text] => [attr] => Array ( ) ) [6] => Array ( [str] => {t:var.cfg_title/} [tagname] => var [tagfield] => cfg_title [text] => [attr] => Array ( ) ) [7] => Array ( [str] => {t:field.title function="Html2Text(@me)"/} [tagname] => field [tagfield] => title [text] => [function] => Html2Text(@me) [attr] => Array ( ) ) [8] => Array ( [str] => {t:include filename="header.htm"/} [tagname] => include [tagfield] => [text] => [attr] => Array ( [filename] => header.htm ) ) [9] => Array ( [str] => {t:include filename="header.htm" /} [tagname] => include [tagfield] => [text] => [attr] => Array ( [filename] => header.htm ) ) [10] => Array ( [str] => {t:field.title function='Html2Text(@me)' }{/t:field } [tagname] => field [tagfield] => title [text] => [function] => Html2Text(@me) [attr] => Array ( ) ) [11] => Array ( [str] => {t:array name='asdas' }{/t:array } [tagname] => array [tagfield] => asdas [text] => [attr] => Array ( ) ) [12] => Array ( [str] => {t:channel typeid='1' row='15'} [field:id/][field:typename/] {/t:channel } [tagname] => channel [tagfield] => [text] => [field:id/][field:typename/] [attr] => Array ( [typeid] => 1 [row] => 15 ) ) [13] => Array ( [str] => {t:channel typeid='1'} [field:id/] [field:typename/]{/t:channel} [tagname] => channel [tagfield] => [text] => [field:id/] [field:typename/] [attr] => Array ( [typeid] => 1 ) ) [14] => Array ( [str] => {t:channel typeid='1' }[field:id/] [field:typename/]{/t:channel } [tagname] => channel [tagfield] => [text] => [field:id/] [field:typename/] [attr] => Array ( [typeid] => 1 ) ) [15] => Array ( [str] => {t:channel}[field:typename/]{/t:channel } [tagname] => channel [tagfield] => [text] => [field:typename/] [attr] => Array ( ) ) [16] => Array ( [str] => {t:channel typeid='1' row='20' }[field:userid/] [field:scores/] {/t:channel } [tagname] => channel [tagfield] => [text] => [field:userid/] [field:scores/] [attr] => Array ( [typeid] => 1 [row] => 20 ) ) )
测试代码打包下载
php下正则来匹配dede模板标签的代码
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@