php 的 DOMDocument

DOMDocument with php

i want replace all images on my html but the code replace one and escaping one and so on

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

1 2 3 4 images the code replace one and three and escaping tow and four and so on

    $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>

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

您面临的问题是 getElementsByTagName() 返回的节点列表是活动列表。这意味着,当您调用 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 元素。

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

$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 个元素。