問題を解決するには、問題を分割する必要があります。ここには 2 つの主要な部分があります。
- HTML をトップ部分とボトム部分に分割します。
- (両方?)HTML文字列でDOMDocument操作を行います。
やってみましょう:
最初の部分は、実際には非常に単純です。"\n"
すべての行区切り記号があり、空の行が実際には空の行であるとしましょう"\n\n"
。次に、これは単純な文字列操作です。
list($top, $bottom) = explode("\n\n", $html, 2);
これで最初の部分はすでに解決しています。トップの html は に$top
あり、実際にはあまり気にする必要のない残りの部分は に格納され$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">