DOM文档和删除父标签(DOMDocument and delete parent tag)

2019-10-20 10:45发布

我们通过URL加载HTML。 在创建DOM文档后

libxml_use_internal_errors(true); // disable errors

$oHtml = new DOMDocument();

if (!$oHtml->loadHTML($this->getHtml($aData['href']))) {
    return false;
}

下一步是要删除的fancybox或其他的弹出链接...在我们的情况下图像的代码

<a onclick="return hs.expand(this)" href="http://domain.com/uploads/09072014106.jpg">
    <img title="Some title" alt="Some title" src="http://domain.com/uploads/thumbs/09072014106.jpg">
</a>

我们执行的是我们的方法...

$this->clearPopUpLink($oHtml); // delete parent <a tag....

方法...

private function clearPopUpLink($oHtml)
    {
        $aLink = $oHtml->getElementsByTagName('a');
        if (!$aLink->length) {
            return false;
        }

        for ($k = 0; $k < $aLink->length; $k++) {
            $oLink = $aLink->item($k);

            if (strpos($oLink->getAttribute('onclick'), 'return hs.expand(this)') !== false) {
//              <a onclick="return hs.expand(this)" href="http://domain.com/uploads/posts/2014-07/1405107411_09072014106.jpg">
//                  <img title="Some title" alt="Some title" src="http://domain.com/uploads/posts/2014-07/thumbs/1405107411_09072014106.jpg">
//              </a>
                $oImg = $oLink->firstChild;
                $oImg->setAttribute('src', $oLink->getAttribute('href')); // set img proper src

//                $oLink->parentNode->removeChild($oLink);
//                $oLink->parentNode->replaceChild($oImg, $oLink);
                $oLink->parentNode->insertBefore($oImg); // replacing!?!?!?!

//                echo $oHtml->ownerDocument->saveHtml($oImg);
            }
        }
    }

现在的问题......这个代码工作,但我不知道为什么! clearPopUpLink(完成与所有的“图像”为什么时),它与标签不老的代码? 我试图用(在第一次启动时的调查) - >的insertBefore(),之后 - > removeChild之()。 首先是添加简单(编辑)图像BEFOR当前图像( <a> ),之后删除旧节点图像( <a> )。 但! 它不工作,这是每个仅次于做(每个第一正确完成)。

那么,让我问简单的问题,如何做到这一点的正确方法吗? 因为我不认为以下(clearPopUpLink)代码是相当正确的...请提出您的解决方案。

Answer 1:

嗯,我会用受托人的XPath,这和确保锚被删除; 还有你的代码不准确做出明显(我没有测试过)。

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//a[contains(@onclick, "return hs.expand(this)")]/img') as $img) {
        $anchor = $img->parentNode;

        $anchor->parentNode->insertBefore($img, $anchor); // take image out
        $anchor->parentNode->removeChild($anchor); // remove empty anchor
}

echo $doc->saveHTML();


文章来源: DOMDocument and delete parent tag