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> </p>
<p>some text</p>
<p> </p>
<p><img class="img-responsive" src="http://40.media.tumblr.com/c0bc20fd255cc18dca150640a25e13ef/tumblr_nammr75ACv1taqt2oo1_500.jpg" alt="" width="480" height="477" /></p>
<p> </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
个元素。
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> </p>
<p>some text</p>
<p> </p>
<p><img class="img-responsive" src="http://40.media.tumblr.com/c0bc20fd255cc18dca150640a25e13ef/tumblr_nammr75ACv1taqt2oo1_500.jpg" alt="" width="480" height="477" /></p>
<p> </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
个元素。