在下面的代码中,包含空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>");
?>
答案 0 :(得分:0)
div不属于脚本标记。 Javascript属于脚本标记。
从脚本标记中取出div,它应该没问题。
答案 1 :(得分:0)
诀窍很简单,只需一个条件即可将loadHTML
更改为loadXML
HTML字符串必须始终格式正确
$dom->loadXML($html2);