} } }

    zuitu团购模板引擎浅析

    添加时间:2013-5-28 点击量:

         接触过最土的伴侣应当很熟悉  最土模板解析功能首要由 include/function/template.php文件完成 ,就是经由过程正则的调换,捕获来完成罢了,与smarty的道理类似。下面解析下他的正则调换。


             在template.php文件中有这段代码


     



     1 function __parse(¥tFile¥cFile) {
    
    2
    3 ¥fileContent = false;
    4
    5 if(!(¥fileContent = file_get_contents¥tFile)))
    6 return false;
    7
    8 ¥fileContent = preg_replace( /^(\xef\xbb\xbf)/, , ¥fileContent ); //EFBBBF
    9 ¥fileContent = preg_replace(/\<\!\-\-\s\\\¥\{(.+?)\}\s\-\-\>/ies, __replace(<?php \\1; ?>), ¥fileContent);
    10 ¥fileContent = preg_replace(/\{(\\\¥[a-zA-Z0-9_\[\]\\\ \-\\,\%\\/\.\(\)\>\\\¥\x7f-\xff]+)\}/s, <?php echo \\1; ?>, ¥fileContent);
    11 ¥fileContent = preg_replace(/\\\¥\{(.+?)\}/ies, __replace(<?php echo \\1; ?>), ¥fileContent);
    12 ¥fileContent = preg_replace(/\<\!\-\-\s\{else\sif\s+(.+?)\}\s\-\-\>/ies, __replace(<?php } else if(\\1) { ?>), ¥fileContent);
    13 ¥fileContent = preg_replace(/\<\!\-\-\s\{elif\s+(.+?)\}\s\-\-\>/ies, __replace(<?php } else if(\\1) { ?>), ¥fileContent);
    14 ¥fileContent = preg_replace(/\<\!\-\-\s\{else\}\s\-\-\>/is, <?php } ?>, ¥fileContent);
    15
    16 for¥i = 0; ¥i < 5; ++¥i) {
    17 ¥fileContent = preg_replace(/\<\!\-\-\s\{loop\s+(\S+)\s+(\S+)\s+(\S+)\s\}\s\-\-\>(.+?)\<\!\-\-\s\{\/loop\}\s\-\-\>/ies, __replace(<?php if(is_array(\\1)){foreach(\\1 AS \\2=>\\3) { ?>\\4<?php }}?>), ¥fileContent);
    18 ¥fileContent = preg_replace(/\<\!\-\-\s\{loop\s+(\S+)\s+(\S+)\s\}\s\-\-\>(.+?)\<\!\-\-\s\{\/loop\}\s\-\-\>/ies, __replace(<?php if(is_array(\\1)){foreach(\\1 AS \\2) { ?>\\3<?php }}?>), ¥fileContent);
    19 ¥fileContent = preg_replace(/\<\!\-\-\s\{if\s+(.+?)\}\s\-\-\>(.+?)\<\!\-\-\s\{\/if\}\s\-\-\>/ies, __replace(<?php if(\\1){?>\\2<?php }?>), ¥fileContent);
    20
    21 }
    22 //Add for call <!--{include othertpl}-->
    23 ¥fileContent = preg_replace(#<!--\s{\sinclude\s+([^\{\}]+)\s\}\s-->#i, <?php include template(\\1);?>, ¥fileContent);
    24
    25 //Add value namespace
    26 if(!file_put_contents¥cFile¥fileContent))
    27 return false;
    28
    29
    30 return true;
    31 }
    32
    33 function __replace(¥string) {
    34 return str_replace(\, , ¥string);
    35 }


    如今对正则调换进行解析:


    第8行



    ¥fileContent = preg_replace( /^(\xef\xbb\xbf)/, , ¥fileContent ); 


    是过滤掉windows平台下utf8文件的特别字符 ï  » ¿


    第九行



    ¥fileContent = preg_replace(/\<\!\-\-\s\\\¥\{(.+?)\}\s\-\-\>/ies, __replace(<?php \\1; ?>), ¥fileContent);


    规矩浅析:


    <!--(0+个空白字符)¥{除换行符外任何字符}0+个空白字符-->


     


    连络模式批改ies


     


    i不区分大小写 


     


    将调换后的内容作为php代码履行 让__replace()作为php代码     履行取得成果 而不是获得纯真的字符串 相当于eval(调换后的内容


     


    s就不说了


     


    就是<!--¥{php代码}-->   在{}里履行任何php代码


    第10行



     ¥fileContent = preg_replace(/\{(\\\¥[a-zA-Z0-9_\[\]\\\ \-\\,\%\\/\.\(\)\>\\\¥\x7f-\xff]+)\}/s, <?php echo \\1; ?>, ¥fileContent);


    html模板文件里: {¥代码内容可以包含中文)}  =>   <?php echo {}之间的内容 ?>


    eg:{¥a}对应<?php echo ¥a; ?>


     


    用于显示内容


    第11行



    ¥fileContent = preg_replace(/\\\¥\{(.+?)\}/ies, __replace(<?php echo \\1; ?>), ¥fileContent);


    模板代码: ¥{代码}   =><?php echo 代码 ?> 


    eg: ¥{ ¥a}对应 <?php echo  ¥a; ?>


    第12行



     ¥fileContent = preg_replace(/\<\!\-\-\s\{else\sif\s+(.+?)\}\s\-\-\>/ies, __replace(<?php } else if(\\1) { ?>), ¥fileContent);


    模板里的<!-- {else if ‘a’=’a’}-->     转为<?php } else if(a==a) { ?>


    第13行




    ¥fileContent = preg_replace(/\<\!\-\-\s\{elif\s+(.+?)\}\s\-\-\>/ies, __replace(<?php } else if(\\1) { ?>), ¥fileContent);



    模板里 <!-- {elif  a=a} -->  转为  <?php } else if(a=a) { ?>


    第14行


     



    ¥fileContent = preg_replace(/\<\!\-\-\s\{else\}\s\-\-\>/is, <?php }   ?>, ¥fileContent);


     


    模板里 <!-- {else} -->   转为  <?php } else { ?>


    第17行



     ¥fileContent = preg_replace(/\<\!\-\-\s\{loop\s+(\S+)\s+(\S+)\s+(\S+)\s\}\s\-\-\>(.+?)\<\!\-\-\s\{\/loop\}\s\-\-\>/ies, __replace(<?php if(is_array(\\1)){foreach(\\1 AS \\2=>\\3) { ?>\\4<?php }}?>), ¥fileContent);


    模板中


    <!-- {loop ¥arr  ¥k  ¥v} -->


    php内容举例


    <!--{/loop} -->


    调换后


    <?php if(is_array(¥arr)){foreach(¥arr AS ¥k=>¥v) { ?>


    php内容举例


    <?php }}?>


     


    第18行与第17行差不久不多就是少了¥k其他完全一样


     


     



    第19行



    ¥fileContent = preg_replace(/\<\!\-\-\s\{if\s+(.+?)\}\s\-\-\>(.+?)\<\!\-\-\s\{\/if\}\s\-\-\>/ies, __replace(<?php if(\\1){?>\\2<?php }?>), ¥fileContent);


    模板中:


    <!-- {if a } -->


    b


    <!-- {/if}-->


    调换后


    <?php if(a ){?>


    b


    <?php }?>



    大师在测试时件好建几个文件(模板文件,解析文件,生成的php文件)以便于测试


    正在看最土,迎接有爱好的伴侣共同商量!

    分享到: