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