多层if可以用正则处理吗

qiuss2 2015-08-24 09:19:30


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

...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiuss2 2015-08-24
  • 打赏
  • 举报
回复
我自己弄了套模板引擎 写到IF判断部分了 {if:判断条件}结果1{else}结果2{end if} 单条的 用我的代码 可以识别了 如果结果1或结果2里 再嵌套if else end if 的话,不知道咋办哩 希望能无限嵌套
qiuss2 2015-08-24
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
1、你的代码有问题!20 行的 eval($goeval) 执行不了(有语法错) 2、不清楚你要做什么
忘了说了 {field:id} 会被换成一个数字 就当是10吧 然后执行就OK了
xuzuning 2015-08-24
  • 打赏
  • 举报
回复
1、你的代码有问题!20 行的 eval($goeval) 执行不了(有语法错) 2、不清楚你要做什么
qiuss2 2015-08-24
  • 打赏
  • 举报
回复
额 大神 分割了不会用啊 还是乱糟糟的
xuzuning 2015-08-24
  • 打赏
  • 举报
回复
其实利用 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
        )

)

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

21,873

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧