PHP记事(2)
2011-01-07 17:50
246 查看
继续对phpSayTemplateParser类的分析。
phpSayTemplateParser类最重要的函数就是compile(),该函数将HTML模板文件中的特定标签替换成相应的PHP代码,如上文所述。
首先以login页面为例进行分析。
简单的部分略去不说,如:
因为login.html中只有<!-- IF loginResult == "ok" -->,所以能实验到的只有如下代码块:
该段代码将$page字符串中所有匹配正则表达式的字符都存放入$var数组中,通过variable_inspector.php中的var_log函数将该数组输出到一个txt中(如果输入到HTML中,将不能正常显示其内容,所以一定要放到纯文本里面才行)。
通过添加代码:
内容为:
= Array (
| 0 = Array (
| | 0 = "<!-- IF loginResult == "ok" -->"
| | 1 = "<!-- IF loginResult == "error" -->"
| | 2 = "<!-- IF loginResult == "ok" -->"
| )
| 1 = Array (
| | 0 = ""
| | 1 = ""
| | 2 = ""
| )
| 2 = Array (
| | 0 = "loginResult"
| | 1 = "loginResult"
| | 2 = "loginResult"
| )
| 3 = Array (
| | 0 = "=="
| | 1 = "=="
| | 2 = "=="
| )
| 4 = Array (
| | 0 = ""ok""
| | 1 = ""error""
| | 2 = ""ok""
| )
)
= "_obj"
= "loginResult"
= "_obj"
= "loginResult"
= "_obj"
= "loginResult"
至于正则表达式'/<!-- (ELSE)?IF ([a-zA-Z0-9_.]+)[ ]*([!=<>]+)[ ]*(["]?[^"]*["]?) -->/',需要另外新开一个文件进行实验。
phpSayTemplateParser类最重要的函数就是compile(),该函数将HTML模板文件中的特定标签替换成相应的PHP代码,如上文所述。
首先以login页面为例进行分析。
简单的部分略去不说,如:
$page = str_replace(array("/r","/n","/t"),"",$this->template); $page = preg_replace('//s+/',' ',$page); $page = preg_replace('/ +/',' ',$page); $page = preg_replace("/<!-- ENDIF.+?-->/","<?php/n}/n?>",$page); ... $page = str_replace("<!-- ELSE -->","<?php/n} else {/n?>",$page);
因为login.html中只有<!-- IF loginResult == "ok" -->,所以能实验到的只有如下代码块:
if (preg_match_all('/<!-- (ELSE)?IF ([a-zA-Z0-9_.]+)[ ]*([!=<>]+)[ ]*(["]?[^"]*["]?) -->/', $page, $var)) { //echo "if is found"; foreach ($var[2] as $cnt => $tag) { list($parent, $block) = $this->var_name($tag); $cmp = $var[3][$cnt]; $val = $var[4][$cnt]; $else = ($var[1][$cnt] == 'ELSE') ? '} else' : ''; if ($cmp == '=') { $cmp = '=='; } if (preg_match('/"([^"]*)"/',$val,$matches)) { $code = "<?php/n$else"."if (/$parent"."['$block'] $cmp /"".$matches[1]."/"){/n?>"; } elseif (preg_match('/([^"]*)/',$val,$matches)) { list($parent_right, $block_right) = $this->var_name($matches[1]); $code = "<?php/n$else"."if (/$parent"."['$block'] $cmp /$parent_right"."['$block_right']){/n?>"; } $page = str_replace($var[0][$cnt], $code, $page); } }
该段代码将$page字符串中所有匹配正则表达式的字符都存放入$var数组中,通过variable_inspector.php中的var_log函数将该数组输出到一个txt中(如果输入到HTML中,将不能正常显示其内容,所以一定要放到纯文本里面才行)。
通过添加代码:
if ($h_v = fopen("vincent.util/var.txt", "w")) { fwrite($h_v, var_log($var)); fclose($h_v); } foreach ($var[2] as $cnt => $tag) { list($parent, $block) = $this->var_name($tag); if ($h_v = fopen("vincent.util/var.txt", "a")) { fwrite($h_v, var_log($parent)); fwrite($h_v, var_log($block)); fclose($h_v); } $cmp = $var[3][$cnt]; $val = $var[4][$cnt]; $else = ($var[1][$cnt] == 'ELSE') ? '} else' : '';
内容为:
= Array (
| 0 = Array (
| | 0 = "<!-- IF loginResult == "ok" -->"
| | 1 = "<!-- IF loginResult == "error" -->"
| | 2 = "<!-- IF loginResult == "ok" -->"
| )
| 1 = Array (
| | 0 = ""
| | 1 = ""
| | 2 = ""
| )
| 2 = Array (
| | 0 = "loginResult"
| | 1 = "loginResult"
| | 2 = "loginResult"
| )
| 3 = Array (
| | 0 = "=="
| | 1 = "=="
| | 2 = "=="
| )
| 4 = Array (
| | 0 = ""ok""
| | 1 = ""error""
| | 2 = ""ok""
| )
)
= "_obj"
= "loginResult"
= "_obj"
= "loginResult"
= "_obj"
= "loginResult"
至于正则表达式'/<!-- (ELSE)?IF ([a-zA-Z0-9_.]+)[ ]*([!=<>]+)[ ]*(["]?[^"]*["]?) -->/',需要另外新开一个文件进行实验。
相关文章推荐
- PHP记事
- PHP记事(4)- $_obj变量初探
- php安装配置那些事(本文纯属个人记事与技术无关)
- php在文件中写入回车问题,如何建立文本文件写入回车,记事本能看到
- php-记事狗平台数据库中的表说明
- PHP记事(5)- 关于comment
- PHP记事(1)
- freebsd 记事之PHP环境搭建
- PHP学习笔记 2009-8-19 自动生成记事主题的函数generateNoteTitle()
- freebsd 记事之PHP环境搭建
- php实现简单记事本功能
- 如何获得PHP相关资料
- 连接PHP和 Java -- PHP/Java Bridge [3]
- PHP+MySQL 会员注册(点评)
- PHP中MySQL处理记录
- apache+php+mysql安装配置方法小结
- 一个好用的php 实现无限分类的方法
- php设计模式 Chain Of Responsibility (职责链模式)
- phpexcel 的前端封装类