douding_1073 2016-10-15 16:50
浏览 30
已采纳

使用preg_split来模板化引擎

I am building a templating engine and would like to allow nested logic.

I need to split the following string using "@" for the delimiter but would like to ignore this delimiter - treat is as just another character - if its inside the [square brackets].

Here is the input string:

@if(param1>=7) [ something here @if(param1>9)[ nested statement ] ] @elseif(param2==true) [ 2st condition true ] @else [ default condition ] 

The result should look like:

array(

   " if(param1>=7) [ something here @if(param1>9)[ nested statement ] ] ",

   " elseif(param2==true) [ 2st condition true ] ",

   " else [ default condition ] "

)

I believe preg_split is what Im looking for but could use help with the regex

  • 写回答

3条回答 默认 最新

  • douchiwan1503 2016-10-16 14:47
    关注

    Regex:

    @(?> if | else (?>if)? ) \s*  # Match a control structure
    (?> \( [^()]*+ \) \s*)?  # Match statements inside parentheses (if any)
    \[  # Match start of block
    (?:
        [^][@]*+  # Any character except `[`, `]` and `@`
        (?> \\.[^][@]* )* (@+ (?! (?> if | else (?>if)? ) ) )? # Match escaped or literal `@`s
        |  # Or
        (?R)  # Recurs whole pattern
    )*  # As much as possible
    \]\K\s*  # Match end of container block
    

    Live demo

    PHP:

    print_r(preg_split("~@(?>if|else(?>if)?)\s*(?>\([^()]*+\)\s*)?\[(?:[^][@]*+(?>\\.[^][@]*)*(@+(?!(?>if|else(?>if)?)))?|(?R))*\]\K\s*~", $str, -1, PREG_SPLIT_NO_EMPTY));
    

    Output:

    Array
    (
        [0] => @if(param1>=7) [ something here @if(param1>9)[ nested statement ] ]
        [1] => @elseif(param2==true) [ 2st condition true ]
        [2] => @else [ default condition ]
    )
    

    PHP live demo

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog