你需要划分问题来解决它。您在这里有两个主要部分:
- 将 HTML 划分为顶部和底部部分。
- 对(两个?)HTML 字符串进行 DOMDocument 操作。
让我们这样做:
第一部分实际上非常简单。假设所有行分隔符都是"\n"
,而空行实际上是空行"\n\n"
。那么这是一个简单的字符串操作:
list($top, $bottom) = explode("\n\n", $html, 2);
这已经解决了第一部分。顶部$top
的 html 保存在$bottom
.
让我们继续第二部分。
例如,通过简单的DOMDocument
操作,您现在可以获取所有图像的列表:
$topDoc = new DOMDocument();
$topDoc->loadHTML($top);
$topImages = $topDoc->getElementsByTagname('img');
您现在唯一需要做的就是从其父图像中删除每个图像:
$image->parentNode->removeChild($image);
然后在<h2>
元素之前插入它:
$anchor = $topDoc->getElementsByTagName('h2')->item(0);
$anchor->parentNode->insertBefore($image, $anchor);
你很好。完整代码示例:
$html = <<<HTML
<h2>Title here</h2>
<img src="001">
<p>Some content here. (for testing purposes)</p>
<img src="002">
<h2>Second Title here (for testing purposes)</h2>
<p>Some content here.</p>
<img src="003">
HTML;
list($top, $bottom) = explode("\n\n", $html, 2);
$topDoc = new DOMDocument();
$topDoc->loadHTML($top);
$topImages = $topDoc->getElementsByTagname('img');
$anchor = $topDoc->getElementsByTagName('h2')->item(0);
foreach($topImages as $image) {
$image->parentNode->removeChild($image);
$anchor->parentNode->insertBefore($image, $anchor);
}
foreach($topDoc->getElementsByTagName('body')->item(0)->childNodes as $child)
echo $topDoc->saveHTML($child);
echo $bottom;
输出:
<img src="001"><img src="002"><h2>Title here</h2>
<p>Some content here. (for testing purposes)</p>
<h2>Second Title here (for testing purposes)</h2>
<p>Some content here.</p>
<img src="003">