php记事,PHP记事(2)

继续对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"

至于正则表达式'//',需要另外新开一个文件进行实验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值