2016-12-13 25 views
0

我嘗試從HTML文件中讀取foreach循環。例如:php正則表達式查找嵌套模式

{foreach $foo as $bar} 
     {$bar->getName()} 
{endforeach} 

// but also nested loops 
{foreach $foo as $bar} 
     {foreach $bar as $b} 
      {$b->getName()} 
     {endforeach} 
{endforeach} 

// with regex 
preg_match_all('/{foreach(.*?)}(.){endforeach}/us',$html, $matches, PREG_SET_ORDER 

將盡我所能在這個偉大的regex101.com網站在這裏... see example
至少我在這個例子中獲得了兩場比賽。
雖然我也想要嵌套部分。
但是,當我在我的PHP應用程序中使用這個正則表達式時,它返回一個空數組。
只要在第二組中使用點(.),就不會像regex101.com那樣返回任何東西

難道這是一個php7的問題嗎?請幫助

+0

聽起來你正在尋找一個[遞歸正則表達式(http://www.rexegg.com/regex- recursion.html)。這樣的模式怎麼樣(沒有標誌)[/ {(foreach)[^}] *}(?> [^ {] + | {(?!(?: end)?\ 1)|(?R) )* {end \ 1} /'](https://www.regex101.com/r/EWgJUy/1) –

+0

但這並不給我內循環。 – FitzPatrick

+0

無論如何......但我意識到這是錯誤的方法。我不需要它們的嵌套順序。現在我用'/ {((\ w +)(。*?))}'得到所有內容,然後執行所有str替換以獲得有效的php字符串。 – FitzPatrick

回答

0

做你已經嘗試過類似的事情:

function parseForeach(s) { 
 
    let [, varName, arrayName, body] = (/(?:{foreach\s?(\$\w+)\s+(?:as)\s+(\$\w+)})\s+{(.*)}\s+(?:{endforeach})/g.exec(s) || []); 
 
    ; 
 
    
 
    console.log({varName, arrayName, body}); 
 
} 
 

 

 
var tpl = ` 
 
{foreach $foo as $bar} 
 
     {$bar->getName()} 
 
{endforeach} 
 

 
// but also nested loops 
 
{foreach $foo as $bar} 
 
     {foreach $bar as $b} 
 
      {$b->getName()} 
 
     {endforeach} 
 
{endforeach} 
 
`; 
 

 

 
parseForeach(tpl);