2017-04-03 1 views
1

완벽하게 유효한 HTML을 PHP DOMDocumnent에로드하는 데 문제가있는 것 같습니다. 일부 연구는 이것이 libxml이 스크립트 태그 내에서 내용을 잘못 처리하는 것과 관련이 있음을 제시합니다. 그러나 나는 이것에 대해 좋은 방법을 찾을 수 없었습니다.PHP DOMDocument + Templates

나는 아래의 간단한 테스트 케이스를 만들었습니다

출처 :

출력
<?php 

$testData = " 
<p>Foo bar &reg;</p> 

<script id='tmpl-js' type='text/x-jsrender'> 
    <div> 
     {{for items}} 
      <div> 
       {{ tmpl='#item-tmpl-js'/}} 
      </div> 
     {{/for}} 
    </div> 
</script> 

<script id='item-tmpl-js' type='text/x-jsrender'> 
    <div> 
     {{title}} 
    </div> 
</script> 
"; 

$dom = new DOMDocument(); 
$dom->loadHTML($testData, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

:

WARNING DOMDocument::loadHTML(): Unexpected end tag : div in Entity, line: 9 on line number 25 

WARNING DOMDocument::loadHTML(): Unexpected end tag : div in Entity, line: 11 on line number 25 

WARNING DOMDocument::loadHTML(): Unexpected end tag : div in Entity, line: 17 on line number 25 

사람이 주위에 얻을 수있는 방법을 알아 냈습니까? http://sandbox.onlinephpfunctions.com/code/9c658439fe277c0f99e1fb823150a4d14d03a693

+1

가 대신 loadXML을 시도 했습니까? 나는 그것을 시도하고 주변 div 태그를 추가하여 예제에서 HTML을 볼 수있었습니다. –

+0

하나의 이슈를 제거하고 다른 이슈가 나타납니다. 또한 콘텐츠에 HTML로 인코딩 된 엔티티가 있습니다. http://sandbox.onlinephpfunctions.com/code/7d4890b0bfe753168b2de46e9bc7bb4f55632086 – Hawxby

+1

&를 % 20으로 대체하십시오. 당신의 샌드 박스에서, 그것은 그것을 보살 피는 것처럼 보였습니다. 적재 후 역순으로 교체 할 수 있습니다. –

답변

0

DOMDocument는 본질적으로 DOM 파서 일뿐입니다.

$testData = " 
<p>Foo bar &reg;</p> 

<script id='tmpl-js' type='text/x-jsrender'><!-- 
    <div> 
     {{for items}} 
      <div> 
       {{ tmpl='#item-tmpl-js'/}} 
      </div> 
     {{/for}} 
    </div> 
--></script> 

<script id='item-tmpl-js' type='text/x-jsrender'><!-- 
    <div> 
     {{title}} 
    </div> 
--></script> 
"; 

내가 "포장하지 않는 스크립트들을 : 따라서, 당신이 할 수있는 유일한 것은 <script> 태그에 대한 지원을 필요로하고 적어도 자바 스크립트 템플릿을 무시하지 않는 간단한 HTML을 생성하는 아마 "모든 브라우저가 요즘 JavaScript를 지원하기 때문에"매번 HTML 주석의 태그는 더 이상 "진언"이 될 수 있습니다. 유스 케이스가 보여 주듯이 반은 사실입니다.

0

이 시도 :

<?php 

$testData = " 
<p>Foo bar &reg;</p> 

<script id='tmpl-js' type='text/x-jsrender'> 
    <div> 
     {{for items}} 
      <div> 
       {{ tmpl='#item-tmpl-js'/}} 
      </div> 
     {{/for}} 
    </div> 
</script> 

<script id='item-tmpl-js' type='text/x-jsrender'> 
    <div> 
     {{title}} 
    </div> 
</script> 
"; 

$dom = new DOMDocument(); 
$testData = '<div>' . str_replace('&','%20',$testData) . "</div>"; 
$dom->loadHTML($testData, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);