PHP: RegEx for nested {IF} {ENDIF} Conditions



我整天都在搜索仅匹配嵌套条件代码中的内部 {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但这不起作用,因为我只得到了整个字符串。

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

BL,BL,BLI等是动态的,可以不同

Inner IF-ELSE:

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

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

演示

这会抓住你的内部 IF 块:

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

演示(279 步(

该模式使用(*SKIP)(*FAIL)并"取消"包含内部 IF 块的任何 IF 块。 这样你只能得到最里面的IF块。

代码:(演示(

$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';

输出:

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

或者更快/更好,负面展望:

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

演示(190 步(

最新更新