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


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 相关文章推荐
一次编写,随处运行
Oct 09 PHP
PHP 图片上传代码
Sep 13 PHP
php 按指定元素值去除数组元素的实现方法
Nov 04 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
linux中cd命令使用详解
Jan 08 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
thinkPHP事务操作简单案例分析
Oct 17 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 #PHP
使用VisualStudio开发php的图文设置方法
Aug 21 #PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 #PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 #PHP
PHP 数组基础知识小结
Aug 20 #PHP
一个简单php扩展介绍与开发教程
Aug 19 #PHP
php checkbox 取值详细说明
Aug 19 #PHP
You might like
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
PHP实现计算器小功能
2020/08/28 PHP
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
单位刻章介绍信范文
2014/01/11 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
论文答辩开场白大全
2015/05/27 职场文书
自荐信大全
2019/03/21 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Python图片处理之图片裁剪教程
2021/05/27 Python
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis