php168v7的标签模板,php下正则来匹配dede模板标签的代码

html代码

{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'

}

{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

}

{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

}

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 "

";print_r($m[0]);echo "
";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 "

";

print_r($CTags);

echo "

";

?>

输出内容:

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

)

)

)

测试代码打包下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值