phpでhtml要素の一部を取得する

phpのDOMを使用してhtml要素(<tag>~</tag>)を取得するのが意外と難しい。
tagNameやnodeValueの取出し方は、多くの事例があるので探せば直ぐに見つかるのだが
タグそのものを表示する例はほとんど皆無に近い。

キーワードをいろいろ変えながら探した結果が次のもの。

この解決策は、DOMElement クラス内の
「User Contributed Notes」にある「63」と「15」がヒントになる。
例を見た方が手っ取り早いので、下に例を示す。

(1) サンプルとして次の sample.html を使用する

<br />
&lt;!DOCTYPE html&gt;<br />
&lt;html lang=&quot;ja&quot;&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;テストデータ&lt;/title&gt;<br />
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;テストデータ&lt;/h1&gt;<br />
&lt;p&gt;&amp;lt;table&gt; の全要素を表示します。&lt;/p&gt;<br />
&lt;table id=&quot;test&quot; class=&quot;table&quot;&gt;<br />
	&lt;tr class=&quot;tr&quot;&gt;&lt;th&gt;Header1&lt;/th&gt;&lt;th&gt;Header2&lt;/th&gt;&lt;/tr&gt;<br />
	&lt;tr&gt;&lt;td class=&quot;td&quot;&gt;Data1&lt;/td&gt;&lt;td&gt;Data2&lt;/td&gt;&lt;/td&gt;<br />
&lt;/table&gt;<br />
&lt;div id=&quot;main&quot;&gt;<br />
	&lt;p&gt;test1&lt;/p&gt;<br />
	&lt;p&gt;test2&lt;/p&gt;<br />
	&lt;a href=&quot;*&quot;&gt;Link1&lt;/a&gt;<br />
	&lt;div id=&quot;sub&quot;&gt;<br />
		&lt;p&gt;sub1&lt;/p&gt;<br />
		&lt;p&gt;sub2&lt;/p&gt;<br />
	&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />

(2) table内の全要素を取得する場合
<br />
&lt;?php<br />
header(&quot;Content-Type: text/html; charset=UTF-8&quot;);<br />
// innerHTML形式で要素を出力する例<br />
// 結果は「ページのソース」で確認のこと<br />
function DOMinnerHTML(DOMNode $element) {<br />
    $innerHTML = &quot;&quot;;<br />
    $children  = $element-&gt;childNodes;</p>
<p>    foreach ($children as $child)<br />
    {<br />
        $innerHTML .= $element-&gt;ownerDocument-&gt;saveHTML($child);<br />
    }</p>
<p>    return $innerHTML;<br />
}</p>
<p>$dom= new DOMDocument();<br />
$html = &quot;sample.html&quot;;<br />
@$dom-&gt;loadHTMLFile($html);<br />
// xpathを使用しない場合<br />
//$domTables = $dom-&gt;getElementsByTagName(&quot;table&quot;);<br />
$xpath = new DOMXpath($dom);<br />
$domTables = $xpath-&gt;query(&quot;//table&quot;);<br />
if (!is_null($domTables)) {<br />
	// Iterate over DOMNodeList (Implements Traversable)<br />
	foreach ($domTables as $table){<br />
		echo DOMinnerHTML($table);<br />
	}<br />
}else{<br />
	echo &quot;一致するデータがありません!&quot;;<br />
}<br />
?&gt;<br />

(3)id=”main”であるdiv要素内の全要素を取得する
<br />
&lt;?php<br />
header(&quot;Content-Type: text/html; charset=UTF-8&quot;);<br />
// innerHTML形式で要素を出力する例<br />
// 結果は「ページのソース」で確認のこと<br />
function DOMinnerHTML(DOMNode $element) {<br />
    $innerHTML = &quot;&quot;;<br />
    $children  = $element-&gt;childNodes;</p>
<p>    foreach ($children as $child)<br />
    {<br />
        $innerHTML .= $element-&gt;ownerDocument-&gt;saveHTML($child);<br />
    }</p>
<p>    return $innerHTML;<br />
}</p>
<p>$dom= new DOMDocument();<br />
$html = &quot;sample.html&quot;;<br />
@$dom-&gt;loadHTMLFile($html);<br />
$xpath = new DOMXpath($dom);<br />
$domTables = $xpath-&gt;query(&quot;//div[@id='main']&quot;);<br />
if (!is_null($domTables)) {<br />
	// Iterate over DOMNodeList (Implements Traversable)<br />
	foreach ($domTables as $table){<br />
		echo DOMinnerHTML($table);<br />
	}<br />
}else{<br />
	echo &quot;一致するデータがありません!&quot;;<br />
}<br />
?&gt;<br />

(注)結果は、ブラウザの画面を右クリックして、「ページのソースを表示」(Firefoxの場合)で確認してください。