2012-09-11 2 views
4

임의의 HTML을 기존 DOMDocument 트리에로드해야합니다. 이전 답변은이를 처리하기 위해 DOMDocumentFragment 및 그 방법의 appendXML을 사용하는 것이 좋습니다.PHP DOM DOMDocumentFragment :: appendXML없이 기존 문서에 HTML 추가

@Owlvark은 의견에서 xml이 html이 아니므로 좋은 해결책은 아닙니다.

&ndash과 같은 엔티티가 appendXML 메서드에서 올바른 형식의 XML을 필요로하기 때문에 오류의 원인이된다는 것이 가장 큰 문제였습니다.

엔티티를 정의 할 수 있지만 모든 HTML이 유효하지 않은 문제를 처리하지는 않습니다.

DOMDocument 트리로 HTML을 가져 오는 좋은 해결책은 무엇입니까?

+1

처럼 보인다? –

+1

@FrankFarmer, 내부 오류는 시각적으로 또는 오류 처리기에서 오류를 억제하기 만하면 실제로 문제를 해결할 수 없습니다. 'loadHtml'에 관해서는, 나는 아닙니다. [DOMDocumentFragment :: appendXML'] (http://www.php.net/manual/en/domdocumentfragment.appendxml.php)을 사용하고 있습니다. – wmarbut

+1

[이 답변보기] (http://stackoverflow.com/questions/) 4645738/domdocument-appendxml-with-special-characters) - HTML이 XML이 아닙니다. – Owlvark

답변

6

@FrankFarmer가 제안한대로 DomDocument::loadHtml을 사용하고 구문 분석 된 노드를 가져 와서 현재 문서로 가져 오는 것이 해결책입니다. 내 구현은 그냥 또한, 당신은`바로`있는 DOMDocument :: loadHtml()를 사용하여 문서를로드하는 ... 그것을`libxml_use_internal_errors()`를 켜고 무시해야 할 수도 있습니다이

/** 
* Parses HTML into DOMElements 
* @param string $html the raw html to transform 
* @param \DOMDocument $doc the document to import the nodes into 
* @return array an array of DOMElements on success or an empty array on failure 
*/ 
protected function htmlToDOM($html, $doc) { 
    $html = '<div id="html-to-dom-input-wrapper">' . $html . '</div>'; 
    $hdoc = DOMDocument::loadHTML($html); 
    $child_array = array(); 
    try { 
     $children = $hdoc->getElementById('html-to-dom-input-wrapper')->childNodes; 
     foreach($children as $child) { 
      $child = $doc->importNode($child, true); 
      array_push($child_array, $child); 
     } 
    } catch (Exception $ex) { 
     error_log($ex->getMessage(), 0); 
    } 
    return $child_array; 
}