为什么<script>标记会停止domdocument()解析?</script>

时间:2011-09-09 20:44:33

标签: php domdocument

在下面的代码中,包含空div的脚本标记看似无害的介绍会导致解析失败。 (使用空脚本标记没有问题。)$ html1被正确解析,检索两个跨度的值:

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

而$ html2无法正确解析,只检索脚本标记之前的范围:

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

?>

2 个答案:

答案 0 :(得分:0)

div不属于脚本标记。 Javascript属于脚本标记。

从脚本标记中取出div,它应该没问题。

答案 1 :(得分:0)

诀窍很简单,只需一个条件即可将loadHTML更改为loadXML HTML字符串必须始终格式正确

$dom->loadXML($html2);