用php的DOMDocument

时间:2015-12-29 11:50:06

标签: php domdocument

  

我想替换我的html上的所有图像,但代码替换一个并转义一个,依此类推

我使用DOMDocument替换我的内容上的图像,我使用下一个代码问题是代码转义图像 例如

  

1 2 3 4图像代码替换一个和三个并且转出拖车和四个等等

see the result on action

    $dom = new \DOMDocument();
    $dom->loadHTML("data"));
    $dom->preserveWhiteSpace = true;
    $count = 1;

    $images = $dom->getElementsByTagName('img');
    foreach ($images as $img) {

        $src =   $img->getAttribute('src');
        $newsrc = $dom->createElement("newimg");
        $newsrc->nodeValue = $src;
        $newsrc->setAttribute("id","qw".$count);
        $img->parentNode->replaceChild($newsrc, $img);
        $count++;

    }

    $html = $dom->saveHTML();
    return $html;

html代码是

 <p><img class="img-responsive"  src="http://www.jarofquotes.com/img/quotes/86444b28aa86d706e33246b823045270.jpg" alt="" width="600" height="455" /></p>
 <p>&nbsp;</p>
 <p>some text</p>
 <p>&nbsp;</p>
 <p><img class="img-responsive" src="http://40.media.tumblr.com/c0bc20fd255cc18dca150640a25e13ef/tumblr_nammr75ACv1taqt2oo1_500.jpg" alt="" width="480" height="477" /></p>
 <p>&nbsp;</p>
 <p><span class="marker"><img class="img-responsive" src="http://wiselygreen.com/wp-content/uploads/green-living-coach-icon.png" alt="" width="250" height="250" /><br /><br /></span></p>

我希望输出html用

替换所有图像
   <newimg>Src </newimg>

1 个答案:

答案 0 :(得分:2)

好的,我找不到适合PHP的欺骗,所以我正在回答这个问题。

您面临的问题是getElementsByTagName()返回的NodeLists是实时列表。这意味着,当您对replaceChild()进行调用时,您正在改变当前正在迭代的NodeList。

我们假设我们有这个HTML:

$html = <<< HTML
<html>
    <body>
        <img src="1.jpg"/>
        <img src="2.jpg"/>
        <img src="3.jpg"/>
    </body>
</html>
HTML;

现在让我们将其加载到DOMDocument并获取img元素:

$dom = new DOMDocument;
$dom->loadHTML($html);

$allImages = $dom->getElementsByTagName('img');
echo $allImages->length, PHP_EOL;

这将打印3,因为现在DOM中有3个img元素。

让我们用img元素替换第一个p元素:

$allImages->item(0)->parentNode->replaceChild(
    $dom->createElement("p"),
    $allImages->item(0)
);
echo $allImages->length, PHP_EOL;

现在这给了2,因为现在只剩下2 img个元素,基本上是

item 0: img will be removed from the list
item 1: img will become item 0
item 2: img will become item 1

您正在使用foreach,因此您首先替换项目0,然后转到项目1,但项目1现在是项目2,项目0是您期望的下一项目1。但由于列表是实时的,你正在跳过它。

要解决此问题,请使用while循环并始终替换第一个元素:

while ($allImages->length > 0) {
    $allImages->item(0)->parentNode->replaceChild(
        $dom->createElement("p"),
        $allImages->item(0)
    );
}

然后会捕获所有img元素。