2012-10-22 29 views
0

我想用正則表達式來解析我有的模板。我想爲_start標籤找到_stop標籤。因爲可以嵌套_stop_start標籤,所以我需要找到具體的標籤。preg_match反向引用找到結束標記

我使用的正則表達式是

/{(.*?)_start}.*{(\1_stop)}/s 

和投擲變成一隻preg_match

而且模板

<div data-role="collapsible-set" class="mfe_collapsibles" data-theme="c" data-inset="false"> 
     {MakeAppointment_start} 
     <div id="appointmentHeading" data-action-id="appointmentNext" data-action-text="Next" data-a data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right"> 
      <h3 class="collapsibleMainHeading">New {AppointmentTerm}</h3> 
      <p> 
       {AppointmentForm} 
      </p> 
     </div> 
     {MakeAppointment_stop} 
     {RegisterSection_start} 
     <div id="registerHeading" class="preRegistration" data-action-id="register" data-action-text="Register" data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right"> 
      <h3 class="collapsibleMainHeading">Register</h3> 
      <p> 
       {RegisterForm} 
      </p> 
     </div> 
     {RegisterSection_stop} 
     <div data-role="collapsible" class="preRegistration" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right"> 
      <h3 class="collapsibleMainHeading">Login</h3> 
      <p> 
       {LoginForm} 
      </p> 
     </div> 

    </div> 
</div> 

的結果是

Array 
(
    [0] => {MakeAppointment_start} 
     <div id="appointmentHeading" data-action-id="appointmentNext" data-action-text="Next" data-a data-role="collapsible" data-collapsed="true" data-collapsed-icon="arrow-r" data-expanded-icon="arrow-d" data-iconpos="right"> 
      <h3 class="collapsibleMainHeading">New {AppointmentTerm}</h3> 
      <p> 
       {AppointmentForm} 
      </p> 
     </div> 
     {MakeAppointment_stop} 
    [1] => MakeAppointment 
    [2] => MakeAppointment_stop 
) 

工業ex 0是正確的,但1和2不是。 1應該有寄存器標籤和內容,2不應該存在。

我在這裏做錯了什麼?

回答

2

首先,preg_match只返回一個匹配。改爲使用preg_match_all。其次,你得到的指標1和2是你的捕捉組。你可以簡單地忽略它們,雖然你的第二個捕獲組是相當多餘的;你可以刪除你的正則表達式中的第二對或括號。使用preg_match_all將產生完全匹配和所有匹配的所有捕獲組。

我也認爲你應該逃避{},因爲它們是正則表達式元字符。我想知道爲什麼發動機不會以這種方式窒息他們,但我認爲無論如何逃避它們都是更好的做法。

+0

實際上引擎扼住他們與他們逃脫。 PHP文檔說,如果他們逃脫,他們將被視爲文字字符。 – Bot

+0

但是你希望它們是文字字符。如果你逃脫它們,究竟發生了什麼?或者,你可以發佈你的'preg_match'調用嗎? –