代码之家  ›  专栏  ›  技术社区  ›  fabrik

正则表达式过滤-模仿表达式引擎的模板解析

  •  0
  • fabrik  · 技术社区  · 16 年前

    我想模仿(重现)Expression Engine出色的模板解析方法。(请不要问我为什么不使用它:)

    虽然我能够找到和解析简单的标签,比如

    {example_param = "param_value"}
    

    我无法解析添加了结束标记的标签:

    {cyclic_param}
    ...
    {/cyclic_param}
    

    这是我使用的模式:

    '/[\{^\/](.*)\}/iU'
    

    我知道有无数的regexp导师,但这是我永远无法理解的事情:((我无法从EE的消息来源中弄清楚)

    我如何使用PHP的正则表达式找到开始和结束标签(以及它们的内部块)?

    2 回复  |  直到 16 年前
        1
  •  1
  •   user187291    16 年前
     preg_match('~{(\w+)}(.+?){/\1}~s', $r, $m);
    

    内容将以百万美元计[2]。

    不过,这并不能处理筑巢问题。

    /编辑:完整示例

        $text = "
        foo {single1=abc}
        bar {double1} one {/double1}
        foo {single2=def}
        bar {double2} two {/double2}
    
    
        ";
    
        $tag = '~
            {(\w+)}(.+?){/\1}
            |
            {(\w+)=(.+?)}
        ~six';
    
        preg_match_all($tag, $text, $m, PREG_SET_ORDER);
        foreach($m as $p) {
            if(isset($p[3]))
                echo "single $p[3] with param $p[4]\n";
            else
                echo "double $p[1] with content $p[2]\n";
        }
    
        2
  •  0
  •   Kamilos    16 年前

    '/\{[^\/]*\}/iU'