Home >Backend Development >PHP Tutorial >A brief analysis of zuitu group purchase template engine_PHP tutorial

A brief analysis of zuitu group purchase template engine_PHP tutorial

WBOY
WBOYOriginal
2016-07-20 11:13:45909browse

     接触过最土的朋友应该很熟悉  最土模板解析功能主要由 文件完成 ,就是通过正则的替换,捕获来完成而已,与smarty的原理类似。下面分析下他的正则替换。

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

 

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

现在对正则替换进行分析:

第8行

<span $fileContent</span> = <span preg_replace</span>( '/^(\xef\xbb\xbf)/', '', <span $fileContent</span> ); 

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

第九行

<span $fileContent</span> = <span preg_replace</span>("/\<\!\-\-\s*\\\$\{(.+?)\}\s*\-\-\>/ies", "__replace('<?php \\1; ?>')", <span $fileContent</span>);

规则浅析:

33099dff12591084f28898cba3860946

 

结合模式修正

 

i

 

替换后的内容)

 

s

 


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


 

用于显示内容

第11行

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

eg: ${ $a}对应 ba2e481fc75a907b60814472850239c9

第12行

 <span $fileContent</span> = <span preg_replace</span>("/\<\!\-\-\s*\{else\s*if\s+(.+?)\}\s*\-\-\>/ies", "__replace('<?php } else if(\\1) { ?>')", <span $fileContent</span>);

 

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

 

 

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

 

模板里 27d3c281afea17990b3fd6c7cc5c4ae7   转为  2e0cdddc18bbd5573ad9d300390cc46f

第17行

 <span $fileContent</span> = <span preg_replace</span>("/\<\!\-\-\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 }}?>')", <span $fileContent</span>);

 

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

 

 

 

第19行

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

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/440332.htmlTechArticleFriends who have been in contact with Tutu should be familiar with the Tutu template parsing function, which is mainly completed by files, that is, through regular replacement , just to complete the capture, similar to the principle of smarty. Analysis below...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn