设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 931|回复: 1

[教程] 巧用HTML注释和php正则,实现静态模板与动态实现分离 [复制链接]

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

帖子
2836
精华
2
声望
12984 点
金币
2999 Mold
被赞许
28 次
注册时间
2006-4-28

Mod中国同盟社至高荣誉

发表于 2010-8-21 10:14:43 |显示全部楼层
preg_replace
字符串比对解析并取代。
语法: mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
返回值: 混合类型资料
函数种类: 资料处理

内容说明
本函数以 pattern 的规则来解析比对字符串 subject,欲取而代之的字符串为参数 replacement。返回值为混合类型资料,为取代后的字符串结果。


使用范例


下例返回值为 $startDate = 6/19/1969

  1. <?php
  2. $patterns = array("/(19|20\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/");
  3. $replace = array("\\3/\\4/\\1", "$\\1 =");
  4. print preg_replace($patterns, $replace, "{startDate} = 1969-6-19");
  5. ?>
复制代码


有了这些函数和工具,我们似乎可以自己实现一种标记语言

  1. <!--{if a=1}-->
  2. <!--{end if}-->

  3. {subtemplate search_header}
  4. <!--{if $term!=''}-->
  5. <div id="main">
  6. <div class="top">
  7. <span class="tword">{$term}</span>
  8. <span class="pro">读音:</span> <span class="yinbiao">{$epron}</span><span class="pro">(美)</span>
  9. <span class="yinbiao">{$apron}</span><span class="pro">(英)</span><span id="posp"><script>pronu[0]="http://127.0.0.1/words/{$term}.mp3";</script><a href="#"> </a></span>
  10. <br>
  11. <div class="hanzi"><span style="margin:1px;font-size:14px;">{$term}</span>的中文翻译</div>
  12. </div>
  13. <div class="center">
  14. <span class="tword" style="font-size:14px;margin:0px;line-height:1.85em">{$term}</span>
  15. <!--{loop $def $key $val}-->
  16. <!--{if $temp!=$definition}-->
  17. <!--{execute $temp=$definition}-->
  18. <div class="entry">{$definition}</div>
  19. <!--{/if}-->
  20. <div class="def">{$meaning}</div>
  21. <!--{execute $exp=$dict->getExample($id)}-->
  22. <!--{if count($exp)!=0}-->
  23. <!--{if is_array($exp[0])}-->
  24. <!--{execute extract($exp[0])}-->
  25. <!--{execute $english=preg_replace("/(".$term."[\S]*)/i","<span class='highlight'>\\1</span>",$english)}-->
  26. <div class="example">
  27. <div id="ywjz">{$english}</div>
  28. <div id="zwjz">{$chinese}</div>
  29. </div><br class="distance"/>
  30. <!--{/if}-->
  31. <!--{/if}-->
  32. <!--{/loop}-->
  33. </div>
  34. <div id="relativew">
  35. <div class="left">相关单词</div>
  36. <div class="right">
  37. <a href="#">loops</a>
  38. <a href="#">loops</a>
  39. <a href="#">loops</a>
  40. <a href="http://127.0.0.1/holiday/temp.php?word=word">loops</a>
  41. </div>
  42. </div>
  43. </div>
  44. <!--{else}-->
  45. 对不起未找到该单词
  46. <!--{/if}-->
  47. {subtemplate search_footer}
复制代码

等等。。。
很容易实现动静分离
在写对应的动太部分时只需要一句
include  template("模板名字")
就可以了
template()
其实就是匹配替换那些看似无用的标记
调用这个函数以后,这个模板被替换为
  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>词典搜索_<?=$term?></title>
  5. <link rel="stylesheet" type="text/css" href="searchcss/searchs.css"/>
  6. <script type="text/javascript" src="23yyjs/common.js"></script>
  7. </head>
  8. <body>
  9. <div id="fmp_flash_div"></div>
  10. <script type="text/javascript" src="js/fmp.js"></script>
  11. <script type="text/javascript">
  12. <!--
  13. FMP.cfg.movie = "searchimage/fmp.swf?v=090105a";
  14. FMP.load();
  15. var pronu =new Array();
  16. function play(seq){
  17.   try{
  18.    if(FMP.loaded){
  19.     FMP.stop();
  20.     FMP.setUrl(pronu[seq]);
  21.     FMP.play();
  22.    }else{
  23.     FMP.onLoad=function(){
  24.      FMP.setUrl(pronu[seq]);
  25.      FMP.play();
  26.     }
  27.    }
  28.   }catch(e){}   
  29. }
  30. //-->
  31. </script>
  32. <div id="top"></div>
  33. <div id="inter"><div class="inner"><a href="#" style="color:#000000;font-size:12px;">把爱上设为首页</a></div></div><? if($term!='') { ?>
  34. <div id="main">
  35. <div class="top">
  36. <span class="tword"><?=$term?></span>
  37. <span class="pro">读音:</span> <span class="yinbiao"><?=$epron?></span><span class="pro">(美)</span>
  38. <span class="yinbiao"><?=$apron?></span><span class="pro">(英)</span><span id="posp"><script>pronu[0]="http://127.0.0.1/words/<?=$term?>.mp3";</script><a href="#"> </a></span>
  39. <br>
  40. <div class="hanzi"><span style="margin:1px;font-size:14px;"><?=$term?></span>的中文翻译</div>
  41. </div>
  42. <div class="center">
  43. <span class="tword" style="font-size:14px;margin:0px;line-height:1.85em"><?=$term?></span><? if(is_array($def)) { foreach($def as $key => $val) { if(is_array($val)) extract($val);?><? if($temp!=$definition) { ?>
  44. <? $temp=$definition;?>
  45. <div class="entry"><?=$definition?></div>
  46. <? } ?>
  47. <div class="def"><?=$meaning?></div>
  48. <? $exp=$dict->getExample($id);?>
  49. <? if(count($exp)!=0) { ?>
  50. <? if(is_array($exp[0])) { ?>
  51. <? extract($exp[0]);?>
  52. <? $english=preg_replace("/(".$term."[\S]*)/i","<span class='highlight'>\\1</span>",$english);?>
  53. <div class="example">
  54. <div id="ywjz"><?=$english?></div>
  55. <div id="zwjz"><?=$chinese?></div>
  56. </div><br class="distance"/>
  57. <? } ?>
  58. <? } ?><? } } ?></div>
  59. <div id="relativew">
  60. <div class="left">相关单词</div>
  61. <div class="right">
  62. <a href="#">loops</a>
  63. <a href="#">loops</a>
  64. <a href="#">loops</a>
  65. <a href="http://127.0.0.1/holiday/temp.php?word=word">loops</a>
  66. </div>
  67. </div>
  68. </div>
  69. <? } else { ?>
  70. 对不起未找到该单词
  71. <? } ?><div id="inter"><div class="inner"><a href="#" style="color:#000000;font-size:12px;">把爱上设为首页</a></div></div>
  72. </body>
  73. </html>
复制代码




这样的话我们就很容易自己定义一个标记语言
template
函数代码如下
  1.    function  parse_template($tpfile,$tpldir){
  2.    $nest=6;
  3.    $objfile="./".$tpldir."/".$tpfile.".htm";
  4.    if(!file_exists($objfile)){
  5.       $msg="Current template file '$objfile' not found or have no access!";
  6.       include(ERRFILE);
  7.    }
  8.     $template=file_get_contents($objfile);
  9.   for($i = 1; $i<=3; $i++) {
  10.   if(preg_match("/[\n\r\t]*\{subtemplate\s+([a-z0-9_]+)\}[\n\r\t]*/ies", $template)) {
  11.    $template = preg_replace("/[\n\r\t]*\{subtemplate\s+([a-z0-9_]+)\}[\n\r\t]*/ies", "loadsubtemplate('\\1')", $template);
  12.   }
  13.    }
  14.    $template = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $template);
  15.    $template = preg_replace("/([\n\r\t]*)\{elseif\s+(.+?)\}([\n\r\t]*)/ies", "stripvtags('\\1<? } elseif(\\2) { ?>\\3','')", $template);
  16.    $template = preg_replace("/([\n\r\t]*)\{else\}([\n\r\t]*)/is", "\\1<? } else { ?>\\2", $template);
  17.    $template = preg_replace("/([\n\r\t]*)\{switch[\s]*(.+?)\}([\n\r\t]*)/ies","stripvtags('\\1<? switch\\2 { ?>\\3','')",$template);
  18.    for($i = 0; $i < $nest; $i++){
  19. $template = preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies", "stripvtags('<? if(is_array(\\1)) { foreach(\\1 as \\2) { ?>','\\3<? } } ?>')", $template);
  20. $template = preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies", "stripvtags('<? if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { if(is_array(\\3)) extract(\\3);?>','\\4<? } } ?>')", $template);
  21. $template = preg_replace("/([\n\r\t]*)\{if\s+(.+?)\}([\n\r]*)(.+?)([\n\r]*)\{\/if\}([\n\r\t]*)/ies", "stripvtags('\\1<? if(\\2) { ?>\\3','\\4\\5<? } ?>\\6')", $template);
  22. }
  23.   $template = preg_replace("/([\n\r\t]*)\{execute[\s]*([\S]+?)([\s]*)([\S]+?)[\s]*\}([\n\r\t]*)/ies","stripvtags('\\1<? \\2\\3\\4;?>\\5','')",$template);
  24.   $template = preg_replace("/([\n\r\t]*)\{case[\s]*(.+?)\}([\n\r\t]*)/ies","stripvtags('\\1<? case \\2 { ?>\\3','')",$template);
  25.   $template = preg_replace("/([\n\r\t]*)\{\/case\}([\n\r\t]*)/ies","stripvtags('\\1<? }break; ?>\\2','')",$template);
  26.   $template = preg_replace("/([\n\r\t]*)\{\/switch\}([\n\r\t]*)/ies","stripvtags('\\1<? } ?>\\2','')",$template);
  27.   $template = preg_replace("/\{(\\\$[a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s", "<?=\\1?>", $template);
  28.   $fo=fopen(TEMPLATE_DAT.$tpfile.".tpl.php","w");
  29.   fwrite($fo,$template);
  30.   fclose($fo);
  31.   return true;
  32. }
  33.   function stripvtags($expr, $statement) {
  34.     $expr = str_replace("\\\"", "\"", preg_replace("/\<\?\=(\\\$.+?)\?\>/s", "\\1", $expr));
  35.     $statement = str_replace("\\\"", "\"", $statement);
  36.    return $expr.$statement;
  37. }
  38. function loadsubtemplate($file) {
  39. global $subtemplates;
  40. $tplfile =TEMPLATE.'/'.$file.'.htm';
  41. if(!file_exists($tplfile)) {
  42.   $tplfile = ROOT_PATH.'/template'.$file.'.htm';
  43. }
  44. $content =@implode('',file($tplfile));
  45. $subtemplates[]=$tplfile;
  46. return $content;
  47. }
  48.    function template($template){
  49.     if(parse_template($template,"template"))
  50. return TEMPLATE_DAT.$template.".tpl.php";
  51.    }
复制代码
替换以后只要将其写入一个*.tpl.php文件(上面就是一个被替换而得到的模板文件)
其实整个过程就是preg_replace和正则表达式的运用

使用道具 举报

Rank: 5Rank: 5

帖子
378
精华
0
声望
1035 点
金币
154 Mold
被赞许
2 次
注册时间
2010-7-19
发表于 2010-8-21 12:47:54 |显示全部楼层
您这个是网页开发采用的吧,而且是用于PHP的
话说现在PHP有点落后了

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部