php regex反复出现无法搞清楚

时间:2012-12-17 21:05:08

标签: php regex recursion

嗨我在使用php重复版regexp时遇到了一些问题。我有类似的字符串 {{if(x=y)? {{ true do something || false do something else }} 在我的HTML文件中。它将是某种基本的模板引擎。如果我使用

$matches=array();
$content = "{{if(x=y)? true do something || false do something else }}";
preg_match_all('/\{\{if\((.*?)\)\?(.*?)\|\|(.*?)\}\}/is',$content,$matches);

按我的预期返回结果。

Array(
 [0] => Array
    (
        [0] => {{if(x=y)?
            true do something 
               ||
            false do something else 
               }}
    )
 [1] => Array
    (
        [0] => x=y
    )
 [2] => Array
    (
        [0] => true do something 
    )
 [3] => Array
    (
        [0] => false do something else 
    )
)

但如果模式与另一个模式嵌套;

{{if(x=y)?
  {{if(y=z)?
     true do something 
   || 
     false do something else 
  }}
||
  {{if(x=a)?
    true do something 
  || 
   false do something else 
  }}
}} 

它将第一个“}}”字符作为模式的结尾并失败

Array
(
    [0] => Array
    (
        [0] => {{if(x=y)?
            {{if(y=z)?
          true do something 
            ||
          false do something else 
            }}
        )
    [1] => Array
    (
        [0] => x=y
    )
    [2] => Array
    (
        [0] => {{if(y=z)?
    true do something   
    )
    [3] => Array
    (
        [0] => 
    false do something else     
    )
)

我想制作一个重复的正则表达式,所以在true或false的每一部分中,它应该检查匹配的内容是否再次具有相同的模式。 If的逻辑部分已经完成。我只需要一个正则表达式匹配部分,这样我就可以通过结果循环。凭借我的正则表达式知识,这是我迄今为止所能做的。编辑 为了更具描述性,我需要一个正则表达式来解析这样的东西。

{{if()?{{if()?{{if()?...||...}}||{{if()?...||...}}}}||{{if()?{{if()?...||...}}||{{if()?...||...}}}}}}

但是我使用的正则表达式只能从第一个{{if to first}}中找到它找到哪个返回

{{if(){{if(){{if()...||...}}

正确的正则表达式。但是我如何将正则表达式统称为“获取整个文本,找到{{if()?和}}之间的块直到结束,如果它不在最后则忽略任何其他”或“获得最外层{{if ()?||}}阻止。 感谢

1 个答案:

答案 0 :(得分:1)

我使用link解决了这个问题。脚本的作者使用不同的风格使其变得简单。在我的示例中,我试图将代码块与regexp匹配并将其替换为数据,但他实际上将代码块替换为php代码并在具有相同结构的不同文件夹中重新创建文件,并且每次请求页面时,首先检查文件存在和更新时间并运行脚本。很聪明。也许不是一个完美的解决方案和理性,但解决了我的问题。无论如何,谢谢