//处理if判断标签 格式为 {if:条件} axxx {else} xxxb {end if}
function Parser_IF($c,$times=0){
//return $c;
$p = '/\{if:(.+?)\}([\s\S]*?)\{end if\}/i';
preg_match_all($p, $c, $matches);
for($k=0;$k<count($matches[0]);$k++){
$value = '';
$iff = $matches[0][$k];
$conditin = $matches[1][$k];
$r = $matches[2][$k];
if(strstr($r,'{else}')){ //如果存在else
$rr = explode('{else}',$r);
$r1 = $rr[0];
$r2 = $rr[1];
$goeval = 'if('.$conditin.'){$value = "'.htmlspecialchars($r1).'";}else{$value = "'.htmlspecialchars($r2).'";}';
} else {
$goeval = 'if('.$conditin.'){$value = "'.htmlspecialchars($r).'";}';
}
//var_dump($goeval);
if(!empty($conditin)){eval($goeval);
$value = htmlspecialchars_decode($value);
} else { $value = 'if判断语句失败!';}
$c = str_ireplace($iff,$value,$c);
}
$times++; //限制循环次数
if(preg_match($p,$c,$matche) and $times<=9) { $c = Parser_IF($c,$times);} //多次循环可能存在的嵌套
return $c;
}以上代码可以应付 {if:{field:id}>9}大于9{else}大于8小于9{end if} 这种情况那下面这种嵌套 可有办法呢?或是别的思路?
{if:{field:id}>8}
{if:{field:id}>9}大于9{else}大于8小于9{end if} (此行可能存在 也可能只是一句话:大于8了!)
{else}
{if:{field:id}>5}大于5小于8{else}小于5{end if} (此行可能存在 也可能只是一句话:小于8了!)
{end if}
function Parser_IF($c,$times=0){
//return $c;
$p = '/\{if:(.+?)\}([\s\S]*?)\{end if\}/i';
preg_match_all($p, $c, $matches);
for($k=0;$k<count($matches[0]);$k++){
$value = '';
$iff = $matches[0][$k];
$conditin = $matches[1][$k];
$r = $matches[2][$k];
if(strstr($r,'{else}')){ //如果存在else
$rr = explode('{else}',$r);
$r1 = $rr[0];
$r2 = $rr[1];
$goeval = 'if('.$conditin.'){$value = "'.htmlspecialchars($r1).'";}else{$value = "'.htmlspecialchars($r2).'";}';
} else {
$goeval = 'if('.$conditin.'){$value = "'.htmlspecialchars($r).'";}';
}
//var_dump($goeval);
if(!empty($conditin)){eval($goeval);
$value = htmlspecialchars_decode($value);
} else { $value = 'if判断语句失败!';}
$c = str_ireplace($iff,$value,$c);
}
$times++; //限制循环次数
if(preg_match($p,$c,$matche) and $times<=9) { $c = Parser_IF($c,$times);} //多次循环可能存在的嵌套
return $c;
}以上代码可以应付 {if:{field:id}>9}大于9{else}大于8小于9{end if} 这种情况那下面这种嵌套 可有办法呢?或是别的思路?
{if:{field:id}>8}
{if:{field:id}>9}大于9{else}大于8小于9{end if} (此行可能存在 也可能只是一句话:大于8了!)
{else}
{if:{field:id}>5}大于5小于8{else}小于5{end if} (此行可能存在 也可能只是一句话:小于8了!)
{end if}
2、不清楚你要做什么
忘了说了 {field:id} 会被换成一个数字 就当是10吧 然后执行就OK了
{if:判断条件}结果1{else}结果2{end if}
单条的 用我的代码 可以识别了如果结果1或结果2里 再嵌套if else end if 的话,不知道咋办哩 希望能无限嵌套
其实并不需要做文法分析,只需做词法分析就够了
也就是说,无论是
{if:判断条件}结果1{else}结果2{end if}
还是
{if:判断条件}
结果1
{if:判断条件}结果1{else}结果2{end if}
{else}
{if:判断条件}结果1{else}结果2{end if}
结果2
{end if}
只需要独立做 {if:判断条件}、{else}、{end if} 的识别就可以了
{if:判断条件}
结果1
{if:判断条件}结果1{else}结果2{end if}
{else}
{if:判断条件}结果1{else}结果2{end if}
结果2
{end if}
TXT;print_r(token_get_all('<?php ' . $s));Array
(
[0] => Array
(
[0] => 372
[1] => <?php
[2] => 1
) [1] => {
[2] => Array
(
[0] => 301
[1] => if
[2] => 1
) [3] => :
[4] => Array
(
[0] => 307
[1] => 判断条件
[2] => 1
) [5] => }
[6] => Array
(
[0] => 375
[1] => [2] => 1
) [7] => Array
(
[0] => 307
[1] => 结果1
[2] => 2
) [8] => Array
(
[0] => 375
[1] => [2] => 2
) [9] => {
[10] => Array
(
[0] => 301
[1] => if
[2] => 3
) [11] => :
[12] => Array
(
[0] => 307
[1] => 判断条件
[2] => 3
) [13] => }
[14] => Array
(
[0] => 307
[1] => 结果1
[2] => 3
) [15] => {
[16] => Array
(
[0] => 303
[1] => else
[2] => 3
) [17] => }
[18] => Array
(
[0] => 307
[1] => 结果2
[2] => 3
) [19] => {
[20] => Array
(
[0] => 307
[1] => end
[2] => 3
) [21] => Array
(
[0] => 375
[1] =>
[2] => 3
) [22] => Array
(
[0] => 301
[1] => if
[2] => 3
) [23] => }
[24] => Array
(
[0] => 375
[1] => [2] => 3
) [25] => {
[26] => Array
(
[0] => 303
[1] => else
[2] => 4
) [27] => }
[28] => Array
(
[0] => 375
[1] => [2] => 4
) [29] => {
[30] => Array
(
[0] => 301
[1] => if
[2] => 5
) [31] => :
[32] => Array
(
[0] => 307
[1] => 判断条件
[2] => 5
) [33] => }
[34] => Array
(
[0] => 307
[1] => 结果1
[2] => 5
) [35] => {
[36] => Array
(
[0] => 303
[1] => else
[2] => 5
) [37] => }
[38] => Array
(
[0] => 307
[1] => 结果2
[2] => 5
) [39] => {
[40] => Array
(
[0] => 307
[1] => end
[2] => 5
) [41] => Array
(
[0] => 375
[1] =>
[2] => 5
) [42] => Array
(
[0] => 301
[1] => if
[2] => 5
) [43] => }
[44] => Array
(
[0] => 375
[1] => [2] => 5
) [45] => Array
(
[0] => 307
[1] => 结果2
[2] => 6
) [46] => Array
(
[0] => 375
[1] => [2] => 6
) [47] => {
[48] => Array
(
[0] => 307
[1] => end
[2] => 7
) [49] => Array
(
[0] => 375
[1] =>
[2] => 7
) [50] => Array
(
[0] => 301
[1] => if
[2] => 7
) [51] => }
[52] => Array
(
[0] => 375
[1] =>
[2] => 7
))