2016-10-11 17 views
2

私は実際にDOMDocumentを解析して頭を悩ましています。 私は次の問題を解決しようとしています。 は、私は第二段落タグの後に何か他のものとのdivに追加する、次のHTMLphpを使ってhtml内の特定の要素の後に新しい要素を挿入するには?

<h1>Title</h1> 
<p>Some Content</p> 
<p>Some More Content</p> 
<p>Other Content</p> 
<p>Last Bit of Content</p> 

を考えます。 基本的な結果は、ここで私は今、今、私の頭を悩まの退屈だ上で、いくつかのポストを見た次

<h1>Title</h1> 
<p>Some Content</p> 
<p>Some More Content</p> 
<div>Something different</div> <!-- new tag --> 
<p>Other Content</p> 
<p>Last Bit of Content</p> 

のようなものである必要があります。

+1

何かお手伝いいただきありがとうございますか?あなたの投稿を読んでいる?あなたはどんな質問をしましたか?私たちがコードを書くことを望みましたか? –

+0

正しい方向を指すことは、DOMDocumentが私にとって初めてのことなのです。 –

+0

htmlはプレーンですか? jqueryのようなjsライブラリを使用していますか? – manuerumx

答えて

3

文字列をhtmlに解析するには、DOMDocumentクラスを使用する必要があります。 htmlを解析した後、3番目のp要素を選択し、DOMNode::insertBeforeを使用して新しい要素を挿入します。 @Mohammad答えを補完するもので

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
// find 3th p tag 
$p = $doc->getElementsByTagName("p")->item(2); 
// create new div tag 
$div = $doc->createElement("div", "Something different"); 
// insert created element after 3th p 
$p->parentNode->insertBefore($div, $p); 
$html = $doc->saveHTML(); 
0

あなたは、H1タグの後と同じレベルで正確に第2のpタグを検索する場合(つまり、完全に正確である)、あなたは、XPathクエリ//h1/following-sibling::p[2]を使用することができます。例:

$html = <<<'EOD' 
<h1>Title</h1> 
<p>Some Content</p> 
<p>Some More Content</p> 
<p>Other Content</p> 
<p>Last Bit of Content</p> 
EOD; 

libxml_use_internal_errors(true); 

$dom = new DOMDocument; 
$dom->loadHTML('<div>' . $html . '</div>', LIBXML_HTML_NOIMPLIED); 

libxml_clear_errors(); 

$xp = new DOMXPath($dom); 

$targetNode = $xp->query('//h1/following-sibling::p[2]'); 

if ($targetNode->length) { 
    $targetNode = $targetNode->item(0); 
    $newNode = $dom->createElement('div', 'something different'); 
    $targetNode->parentNode->insertBefore($newNode, $targetNode->nextSibling); 
    $targetNode->parentNode->insertBefore($dom->createTextNode("\n"), $targetNode->nextSibling); 
} 

$result = ''; 
foreach ($dom->documentElement->childNodes as $childNode) { 
    $result .= $dom->saveHTML($childNode); 
} 
echo $result; 
関連する問題