2013-06-01 134 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) 

需要明確的是,這種嘗試的HTML元素的ID匹配{{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> 

在這種情況下,完整的馬赫是上面的一切。但我希望它停止在那開啓我的第一個。這很重要,因爲稍後在我的代碼中,我需要結尾標記中最後一個>的位置。

任何想法如何我可以改變這個正則表達式一點點?

感謝您的幫助!

+0

**不要使用正則表達式來解析HTML **。你不能用正則表達式可靠地解析HTML,你將面臨悲傷和挫折。只要HTML從你的期望改變,你的代碼就會被破壞。有關如何使用已經編寫,測試和調試的PHP模塊正確解析HTML的示例,請參閱http://htmlparsing.com/php。 –

回答

2

是,只需使用一個ungreedy量詞:

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

另一種方式:與DOM文檔:

$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