//处理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}

解决方案 »

  1.   

    1、你的代码有问题!20 行的 eval($goeval) 执行不了(有语法错)
    2、不清楚你要做什么
      

  2.   


    忘了说了 {field:id} 会被换成一个数字 就当是10吧 然后执行就OK了
      

  3.   

    我自己弄了套模板引擎 写到IF判断部分了
     {if:判断条件}结果1{else}结果2{end if} 
    单条的 用我的代码 可以识别了如果结果1或结果2里 再嵌套if else end if 的话,不知道咋办哩 希望能无限嵌套
      

  4.   

    猜你也是在写模板引擎,但你的这种设计有点问题
    其实并不需要做文法分析,只需做词法分析就够了
    也就是说,无论是 
    {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} 的识别就可以了 
      

  5.   

    其实利用 php 提供的 token_get_all 可使事情变得简单的多$s =<<< TXT
    {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
            ))