2016-09-13 2 views
1

나누기 왜 것이 코드 :이 코드에PHP DOMDocument를 saveHTML 포맷

<p><img alt="fluid cat" src="/images/tmp/fluid-cat.jpg"></p><p><img alt="pandas" src="/images/tmp/pandas.jpg"></p> 

결과 :

<p><img alt="fluid cat" src="/images/full/2016-09/fluid-cat.jpg"><p><img alt="pandas" src="/images/full/2016-09/pandas.jpg"></p></p> 

것은 왜 모두 IMG을 배치 않습니다이 코드를 실행

$doc = new DOMDocument(); 
$doc->loadHTML($this->content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
$imgNodes = $doc->getElementsByTagName('img'); 

if ($imgNodes->length > 0) { 
    $inlineImage = new Image(); 
    $inlineImage->setPublicDir($publicDirPath); 

    foreach ($imgNodes as $imgNode) { 
     $inlineImage->setUri($imgNode->getAttribute('src')); 
     $inlineImage->setName(basename($inlineImage->getUri())); 

     if ($inlineImage->getUri() != $dstPath.$inlineImage->getName()) { 
      $inlineImage->move($dstPath); 

      $imgNode->setAttribute('src', $dstPath.'/'.$inlineImage->getName());     
     } 
    } 

    $this->content = $doc->saveHtml(); 

} 

첫 번째 p 블록 안의 태그?

+0

html 샘플에 루트 요소가 없기 때문에. Libxml은 첫 번째 p가 루트 요소라고 가정하고 자동 수정을 수행합니다. "고아"닫는 p 태그를 제거하고 닫는 태그를 "좋은 위치", 즉 끝에 배치합니다. 이 문제를 해결하려면 가짜 루트 요소 (예 :'

....
'또는'LIBXML_HTML_NOIMPLIED'를 제거)를 추가하고 자식 노드를 하나씩 추출하여 연결하여 결과 문자열을 만듭니다. –

+0

DomDocument가 HTML의 형식을 올바르게 지정하려고합니다. img 태그 끝 부분에'/'를 추가하여 자동 닫음을 시도하십시오. – bassxzero

+0

'loadHTML()'과'saveHTML()'은 실제로 무너지고 실제로 쓸모가 없습니다. [html5lib-php] (https://github.com/html5lib/html5lib-php)와 같은 타사 HTML 파서와 사용자 정의 HTML 코드 생성기를 사용해보십시오. –

답변

4

귀하의 HTML 샘플에는 모두를 둘러싼 루트 요소가 없습니다. LIBXML이 html을 파싱하여 DOM 트리를 작성하면 처음 발견 된 태그가 루트 요소라고 가정합니다. 따라서 첫 번째 태그 </p>은 고아 닫기 태그로 표시되며 그 뒤에 내용이 있으므로 자동으로 제거되고 끝에 </p>이 추가되어 루트 요소를 닫습니다.

HTML 부분으로 작업 할 때 이러한 자동 수정을 피하려면 (전체 HTML 문서가 아닌) 가짜 루트 요소를 추가해야합니다. 결과 문자열을 생성하려면이 가짜 루트 요소의 각 자식 노드를 저장해야합니다. 예 :

$html = '<p><img alt="fluid cat" src="/images/tmp/fluid-cat.jpg"></p><p><img alt="pandas" src="/images/tmp/pandas.jpg"></p>'; 

$doc = new DOMDocument; 
$doc->loadHTML('<div>' . $html . '</div>', LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); 
#    ^-----------------^----- fake root element 
$root = $doc->documentElement; 

$result = ''; 

foreach($root->childNodes as $childNode) { 
    $result .= $doc->saveHTML($childNode); 
} 

echo $result; 
관련 문제