2017-08-27 75 views
3

我在整個一天搜索與嵌套條件代碼中內部{IF} - {ENDIF} - 語句相匹配的RegEx。有人有想法嗎?PHP:適用於嵌套{IF}的RegEx {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等是動態的,可以不同

+1

我不認爲正則表達式是這裏的方式(類同解析XML/HTML)。我會考慮解析文本manualy(遍歷文本,當你點擊{你檢查關鍵字)。這樣你可以自己構建一棵樹,然後獲取你需要的任何節點。 – insider

+0

謝謝,經過漫長的搜索和失敗,我使用該解決方案。 – kilian

回答

1

這抓住你內IF塊:

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

Demo(279步)

模式使用(*SKIP)(*FAIL)和「不夠格「任何包含內部IF塊的IF塊。這樣你只能得到最內層的IF塊。

代碼:(Demo

$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}/ 

Demo(190步)

1

內IF-ELSE:

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

  • (?!.*{IF)從該位置向前看,並聲稱它不會匹配
  • 懶惰量詞?是指示停止在最早的比賽。

Demo