2011-09-09 19 views
0

在以下代碼中,看似無害的包含空div的腳本標記的引入會導致解析失敗。 (使用一個空的腳本標籤不會造成問題。)$ HTML1被正確解析,檢索兩個範圍的值:爲什麼<script>標籤停止domdocument()解析?

Array 
(
    [0] => test1 
    [1] => test2 
) 

而$ HTML2沒有得到正確解析,僅檢索script標籤之前的跨度:

Array 
(
    [0] => test1 
) 

爲什麼會發生這種情況?打開錯誤時,出現兩個錯誤:「意外結束標記:腳本」和「意外結束標記:div」,但我不知道這些意外的原因。

<?php 

$html1 = <<<EOT 


<div class="productList"> 

    <span>test1</span> 

    <div></div> 

    <span>test2</span> 

</div> 

EOT; 

$html2 = <<<EOT 

<div class="productList"> 

    <span>test1</span> 

    <script> 

     <div></div> 

    </script> 

    <span>test2</span> 

</div> 

EOT; 

libxml_use_internal_errors(true); 

$dom = new DOMDocument(); 
$dom->loadhtml($html1); 
$xpath = new DOMXPath($dom); 

$titles_nodeList = $xpath->query('//div[@class="productList"]/span'); 

foreach ($titles_nodeList as $title) { 
    $titles[] = $title->nodeValue; 
} 

echo("<p>titles without script tag and div</p>"); 
echo("<pre>"); 
print_r($titles); 
echo("</pre>"); 

unset($titles); 

$dom->loadhtml($html2); 
$xpath = new DOMXPath($dom); 

$titles_nodeList = $xpath->query('//div[@class="productList"]/span'); 

foreach ($titles_nodeList as $title) { 
    $titles[] = $title->nodeValue; 
} 

echo("<p>titles with script tag and div</p>"); 
echo("<pre>"); 
print_r($titles); 
echo("</pre>"); 

?> 
+0

您可能會發現有用的在這個問題上的東西:DOM解析器,允許HTML5風格標籤](http://stackoverflow.com/questions/4029341/dom-parser-that-allows-html5-style-in-script-tag)。 –

+0

@Paul DelRe確實看起來像是同樣的問題,他通過使用不同的DOM解析器解決了這個問題。我想我的選擇是在這樣做或只是使用正則表達式來刪除腳本。 – jela

回答

0

div不屬於腳本標記內。 Javascript屬於腳本標籤內。

把div從腳本標記中取出,它應該沒問題。

+1

我的問題是我無法控制要解析的html,並且這個html在腳本中包含div。我想知道是否只有在分析之前使用正則表達式來刪除腳本之類的破解工作纔有效。 – jela

0

訣竅很簡單,用一個條件改變loadHTMLloadXML
HTML字符串必須始終合式

$dom->loadXML($html2);