2012-10-22 2 views
0

정규식을 사용하여 템플릿을 파싱하려고합니다. _start 태그에 _stop 태그를 찾고 싶습니다. _stop_start 태그가 중첩 될 수 있으므로 특정 태그를 찾아야합니다.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> 

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

preg_match

에 그것을 던져 그리고 템플릿입니다

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' 호출을 게시 할 수 있습니까? –