继续对phpSayTemplateParser类的分析。
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("//","<?php /n}/n?>",$page);
...
$page = str_replace("","<?php /n} else {/n?>",$page);
因为login.html中只有,所以能实验到的只有如下代码块:
if (preg_match_all('//', $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 = ""
| | 1 = ""
| | 2 = ""
| )
| 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"
至于正则表达式'//',需要另外新开一个文件进行实验。