0

次のhtmlを検討してください。

<html>
    <title>Xyz</title>
    <body>
        <div>
            <div class='mycls'>
                <div>1 Books</div>
                <div>2 Papers</div>
                <div>3 Pencils</div>
            </div>
        </div>
    <body>
</html>
$dom = new DOMDocument();
$dom->loadHTML([loaded html of remote url through curl]);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('html/body/div[@class="mycls"]');

ここまでは正常に動作しているので、次のようにノードを置き換える必要があります。

<body>
        <div>
            <span>
                <div>1 Books</div>
                <div>2 Papers</div>
                <div>3 Pencils</div>
            </span>
        </div>
    <body>
4

1 に答える 1

1

次のようなものがうまくいくはずです:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$oldNode = $xpath->query('//div[@class="mycls"]')->item(0);
$span = $dom->createElement('span');

if ($oldNode->hasChildNodes()) {
    $children = [];
    foreach ($oldNode->childNodes as $child) {
        $children[] = $child;
    }
    foreach ($children as $child) {
        $span->appendChild($child->parentNode->removeChild($child));
    }
}

$oldNode->parentNode->replaceChild($span, $oldNode);

echo htmlspecialchars($dom->saveHTML());

デモ: http://codepad.viper-7.com/WNTrR5

デモでは、完全に壊れていた HTML も修正したことに注意してください :-)

デモが実際に cURL 呼び出しから返される HTML であり、それを変更できない (制御できない) 場合は、次のことができます。

$libxmlErrors = libxml_use_internal_errors(true); // at the start

libxml_use_internal_errors($libxmlErrors); // at the end

エラーのポップアップを防ぐには

于 2013-03-05T12:57:19.330 に答える