PHP:RegEx用于嵌套的{IF}{ENDIF}条件

PHP:RegEx用于嵌套的{IF}{ENDIF}条件,php,regex,if-statement,Php,Regex,If Statement,我整天都在搜索一个正则表达式,它只匹配嵌套条件代码中的内部{IF}-{ENDIF}-语句。有人有主意吗 例如: {IF bla}Text 1{ELSEIF ble}Text 2 {IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} Main text end{/ENDIF} 我只是想 {IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} 我尝试了\{IF.*\}.\{ENDIF\}is,但这不起作用,因为我只得到整个字符串 同样重要

我整天都在搜索一个正则表达式,它只匹配嵌套条件代码中的内部{IF}-{ENDIF}-语句。有人有主意吗

例如:

{IF bla}Text 1{ELSEIF ble}Text 2 {IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} Main text end{/ENDIF}
我只是想

{IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF}
我尝试了
\{IF.*\}.\{ENDIF\}is
,但这不起作用,因为我只得到整个字符串

同样重要的是:代码可以有几行和换行符


bla、ble、bli等是动态的,可以不同

这抓住了您的内部IF块:

/{IF(?:.*?(?={IF)(*SKIP)(*FAIL)|.*?){ENDIF}/
(279个步骤)

该模式使用
(*跳过)(*失败)
和“取消资格”任何包含内部IF块的IF块。这样,您只能得到最里面的IF块

代码:()

输出:

{IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF}

或更快/更好地使用负前瞻:

/{IF(?!.*{IF).*?{ENDIF}/
(190步)

内部IF-ELSE:

{IF(?..*{IF.*?}.*?{ENDIF}

  • (?!.{IF)
    从该位置向前看,并断言它不匹配
  • 惰性量词
    是在最早匹配时停止的指令

< /P>我不认为ReXEP是这里的方法(类似于解析XML/HTML)。我会考虑解析文本手册(遍历文本,当你点击{你检查关键字)。这样你就可以自己建立一棵树,然后采取任何你需要的节点。谢谢,经过长时间的搜索和失败,我使用了这个解决方案。

/{IF(?!.*{IF).*?{ENDIF}/