2013-06-01 3 views
1

그래, 정규 표현식을 사용하기 때문에 일부 html 파일의 특정 패턴과 일치 시키려고합니다. 여기에는 preg_match 문의 :PHP preg_match - 일치하는 html 요소

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*>[\s\S]*</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE) 

이 명확하기는,이의 ID로 HTML 요소를 일치하도록 시도 {{ALViewElement _ *}.} 그러나 또한 예를 들어 만약을 위해, 닫는 태그 자체를 종료 할 필요가 $ htmlElementType은 "section"이며 "/ section>"으로 끝납니다. 우리가 HTML에서 섹션 요소 이상이 있고 또한 닫는/섹션이있는 경우

<section id="{{ALViewElement_resume}}"> 
      <!--{{RESUME_ADD_CHANGE_PIECE}}--> 
      <!--{{RESUME}}--> 
     </section> 

문제는 다음과 같습니다

내 HTML은 예상대로 작동, 거기에 다른 아무것도 그냥이처럼 보였다 경우 >. 예 :

<section id="{{ALViewElement_resume}}"> 
      <!--{{RESUME_ADD_CHANGE_PIECE}}--> 
      <!--{{RESUME}}--> 
     </section> 
     <div> 

     </div> 
     <section> 
      HEY THIS IS ME 
     </section> 

이 경우 전체 mach는 위의 모든 것입니다. 그러나 나는 그걸 멈추고 싶다. 나중에 내 코드에서 해당 끝 태그에있는 마지막 위치가 필요하기 때문에 중요합니다.

어떻게이 정규 표현식을 조금 바꿀 수 있었는지 생각해보십시오.

도움 주셔서 감사합니다.

+0

** HTML을 구문 분석하는 정규 표현식을 사용하지 마십시오

preg_match('@<'.$htmlElementType.' id\s*=\s*"{{ALViewElement_'.$this->_elementId.'}}".*?>[\s\S]*?</'.$htmlElementType.'(>)@i', $htmlString, $newMatches, PREG_OFFSET_CAPTURE) 

또 다른 방법 :있는 DOMDocument로합니다. 정규식으로 HTML을 안정적으로 구문 분석 할 수는 없으며 슬픔과 좌절을 당할 것입니다. HTML이 예상과 다르게 변경되면 코드가 손상됩니다. 이미 작성, 테스트 및 디버깅 된 PHP 모듈을 사용하여 HTML을 올바르게 구문 분석하는 방법의 예는 http://htmlparsing.com/php를 참조하십시오. –

답변

2

예, 그냥 ungreedy 정량 사용 : **

$html = <<<LOD 
<section id="{{ALViewElement_resume}}"> 
     <!--{{RESUME_ADD_CHANGE_PIECE}}--> 
     <!--{{RESUME}}--> 
</section> 
<div> 

</div> 
<section> 
    HEY THIS IS ME 
</section> 
LOD; 
$doc= new DOMDocument(); 
@$doc->loadHTML($html); 
$node = $doc->getElementById("{{ALViewElement_resume}}"); 

$docv = new DOMDocument(); 
$docv->appendChild($docv->importNode($node, TRUE)); 
$result = $docv->saveHTML(); 
echo htmlspecialchars($result); 
+0

굉장합니다. 그런 일이 존재한다는 것을 몰랐습니다. 감사! – user1513171