繁体   English   中英

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

[英]PHP: RegEx for nested {IF} {ENDIF} Conditions

我整天都在搜索一个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等是动态的,可以有所不同

这抓住你的内部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步)

内部IF-ELSE:

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

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

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM