2017-04-03 100 views
1

我似乎已經完全加載有效的HTML到PHP DOMDocumnent一個問題。一些研究表明,這與libxml在腳本標籤內處理不好的內容有關。但是我一直無法找到解決這個問題的好方法。PHP + DOM文檔模板

我已經創建了一個簡單的測試案例:

來源:

<?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

DOM文檔不是一個完全成熟的瀏覽器,它只是一個DOM解析器。因此,你唯一可以做的事情可能是生成簡單的HTML不需要支持,爲<script>標籤和至少得到忽略了JavaScript的模板:

$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> 
"; 

我聽到了「不換行腳本因爲「所有瀏覽器時下都支持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);