正则表达式过滤 - 模仿Expression Engine的模板解析

时间:2009-10-14 10:30:26

标签: php regex

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

虽然我能够找到并解析像

这样的简单标签
{example_param = "param_value"}

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

{cyclic_param}
...
{/cyclic_param}

这是我正在使用的模式:

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

但它也会返回{/ cyclic_param}。

我知道那里有数以万计的正则表达式导师,但这是我无法理解的事情:((我无法从EE的来源中找到答案)

如何使用PHP的regexp找到开始和结束标记(以及它们的内部块)?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

 preg_match('~{(\w+)}(.+?){/\1}~s', $r, $m);

内容将在$ m [2]。

这不会处理嵌套。

/ edit:完整示例

    $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";
    }

答案 1 :(得分:0)

我认为这适合你:

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