loadHTML / saveHTML DOM问题

时间:2014-03-18 15:01:29

标签: php html dom xpath

运行以下代码后,我得到“No Match”:

$testcontent = '<div><p>Reader&rsquo;s Digest & More!</p></div>';
$dom = new DOMDocument();
$dom->loadHTML($testcontent);
$xpath = new DOMXPath($dom);
$testcon = $xpath->query('*');

echo $testcontent . '<br />';

foreach ($testcon->item(0)->childNodes as $child) {
    $savehtml = $dom->saveHTML($child);
}

echo $savehtml . '<br />';

if ($testcontent == $savehtml) {
    echo "Match";
}
else {
    echo "No Match";
}

任何人都可以告诉我为什么loadHTML函数或saveHTML函数似乎改变了我传入的HTML。我希望这段代码能够回应“匹配”,但由于某种原因,即使页面上的回显文本看起来都相同,第二个版本也有所改变,因为&字符已更改为&amp。反正有没有避免这种自动转换?

这是页面输出的来源:

<div><p>Reader&rsquo;s Digest & More!</p></div>
<div><p>Reader’s Digest &amp; More!</p></div>
No Match

您将在上面看到HTML如何被改变。

2 个答案:

答案 0 :(得分:0)

要查看HTML,请使用DOMDocument::saveHTML() (or saveXML()).

可能会帮助你

答案 1 :(得分:0)

看起来DOMXPath是问题的根源,因为当我有这个代码时

<?php
    header("Content-Type: text/html; charset=utf-8");
    $testcontent = '<div><p>Reader&rsquo;s Digest &amp; More!</p></div>';
    $dom = new DOMDocument();
    $dom->loadHTML($testcontent);
    echo $dom->saveHTML(); //prints the correct html
    $xpath = new DOMXPath($dom);
    $testcon = $xpath->query('*');
    echo $testcontent;
    foreach ($testcon->item(0)->childNodes as $child) {     
        echo "CHILD : " . $child->textContext; //prints the wrong html
        $savehtml = $dom->saveHTML($child);
    }
    echo $savehtml . '<br />';
    if ($testcontent == $savehtml) {
        echo "Match";
    } else {
        echo "No Match";
    }
?>

打印CHILD : <div><p>Reader’s Digest &amp; More!</p></div>