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

时间:2017-08-27 22:06:40

标签: php regex if-statement

我整天都在搜索一个RegEx,它只匹配嵌套条件代码中的内部{IF} - {ENDIF} -Statement。有没有人有想法?

例如:

{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等是动态的,可以有所不同

2 个答案:

答案 0 :(得分:1)

这会抓住你的内部IF块:

UPDATE

Demo(279步)

该模式使用Killed: 9和“取消资格”任何包含内部IF块的IF块。这样你只能获得最里面的IF块。

代码:(Demo

/{IF(?:.*?(?={IF)(*SKIP)(*FAIL)|.*?){ENDIF}/

输出:

(*SKIP)(*FAIL)

使用否定前瞻更快/更好:

$string='{IF bla}Text 1{ELSEIF ble}Text 2 {IF bli}Text 2.1{ELSE blo}Text 2.1{ENDIF} Main text end{/ENDIF}';
echo  preg_match('/{IF(?:.*?(?={IF)(*SKIP)(*FAIL)|.*?){ENDIF}/',$string,$match)?$match[0]:'fail';

Demo(190步)

答案 1 :(得分:1)

内部IF-ELSE:

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

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

Demo