2009-10-14 35 views
0

我想模仿(重现)Expression Engine的神奇模板解析方法。 (为什么不使用它请不要问我:))正则表达式过滤 - 模仿Expression Engine的模板解析

,而我能找到和分析简单的标签,如

{example_param = "param_value"} 

我无法解析标签关闭标签加入其中:

{cyclic_param} 
... 
{/cyclic_param} 

这是我使用的模式:

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

但它返回{/ cyclic_param}过。

我知道有正则表达式的导师那里不计其数,但这是事我永远不能明白:((我不能从EE的来源搞清楚)

我如何才能找到开始和结束标记(与他们的内块太)与PHP的正则表达式?

感谢您的帮助!

回答

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

内容将在$ 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"; 
    } 
+0

不错的一个,但是这个人是不是找到一个标签。也许我需要两次运行我的模板?首先找到双标签,然后再单一的? – fabrik 2009-10-14 10:46:32

+0

用OR语句扩展,它越来越接近,但它还不好:〜\ {(。*)\} | {(。*)}(。+?){/ \ 1}〜s – fabrik 2009-10-14 10:53:36

+0

太棒了!非常感谢你! – fabrik 2009-10-14 11:25:55

0

我认为这是正确的您:

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

这一个只返回第一个单个标签:( – fabrik 2009-10-14 10:49:29