1

嗨,我在使用 php 重复正则表达式时遇到了一些问题。{{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 到 first }} 它找到返回

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

这对于正则表达式是正确的。但是我怎样才能将正则表达式规则为“获取整个文本,找到 {{if()? 和 }} 之间的块直到最后,如果它不在末尾则忽略任何其他块”或“获取最外部的 {{if ()?||}} 块。谢谢

4

2 回答 2

1

任何类型的正则表达式都无法使用嵌套模式。这是正则表达式的基本限制。您需要更强大的解析器形式,例如词法分析器。

简而言之,您必须手动遍历输入的每个字符,解析可能的关键字并记住打开了多少块。

通过调整现有的模板系统来满足您的需求,您的情况可能会好得多。

于 2012-12-18T22:55:47.970 回答
1

我解决了使用链接的问题。脚本的作者用不同的风格让它变得足够简单。在我的示例中,我试图将代码块与正则表达式匹配并将它们替换为数据,但他实际上将代码块替换为 php 代码并在具有相同结构的不同文件夹中重新创建文件,并且每次请求页面时,首先检查文件存在和更新时间并运行脚本。很聪明。也许不是一个完美的解决方案和理性的,但解决了我的问题。不管怎么说,还是要谢谢你

于 2013-01-02T13:47:56.130 回答