PHP の simple_html_dom.php で、htmlファイルのタグをすべて取り出して表示させることは可能ですか。

もし、可能であれば、私が作ったプログラムの修正をお願いできると大変助かります。

http://1811way.com/work008/sample10.html
であれば、
<body>タグ以降

<h4><ul><li><h2><ul><li><h3>....

のように表示できれば、と思っています。
*<>は表示できなくても構いません。

1.私の書いたプログラム
require "simple_html_dom.php";
$html = file_get_html('sample1.html');

foreach ($html as $taglist) {
echo $taglist->tag;
}

2.環境:php5.6 Apache2.4 Windows


以上、よろしくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/01/03 12:00:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント200pt

子供のタグにもぐって行くということですよね。
こんな感じでできます。

<?php
require "simple_html_dom.php";

$html = ...

function extract_child_tag($p) {
    $e = $p->first_child();
    while ($e) {
        echo '&lt;' . $e->tag . '&gt;';
        extract_child_tag($e);
        $e = $e->next_sibling();
    }
}

$body_list = $html->find('body');
extract_child_tag($body_list[0]);

タグを囲む < > をくっつけてますが、要らなかったら echo から外してください。

id:kohhi

お正月に早速回答いただきありがとうございます。いつもすいません。

2016/01/03 11:59:45
id:kohhi

できました。

2016/01/03 12:00:27

その他の回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント200pt

子供のタグにもぐって行くということですよね。
こんな感じでできます。

<?php
require "simple_html_dom.php";

$html = ...

function extract_child_tag($p) {
    $e = $p->first_child();
    while ($e) {
        echo '&lt;' . $e->tag . '&gt;';
        extract_child_tag($e);
        $e = $e->next_sibling();
    }
}

$body_list = $html->find('body');
extract_child_tag($body_list[0]);

タグを囲む < > をくっつけてますが、要らなかったら echo から外してください。

id:kohhi

お正月に早速回答いただきありがとうございます。いつもすいません。

2016/01/03 11:59:45
id:kohhi

できました。

2016/01/03 12:00:27
id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

ポイント200pt

先越されてしまった><
色々書き方はあるので、書いておきます。

<?php
require "simple_html_dom.php";
$html = file_get_html('sample1.html');

function walk($node) {
	#if ($node->nodetype <> 1) return;
	foreach ($node->childNodes() as $child) {
		echo "<".$child->tag.">";
		walk($child);
	}
}

walk($html->find("body", 0));
echo "\n";

<?php
require "simple_html_dom.php";
$html = file_get_html('sample1.html');

$node = $html->find("body *", 0);
while ($node) {
	echo "<".$node->tag.">";
	# 子ノードがあればそれを、なければ兄弟ノードを
	$next = $node->firstChild() ?: $node->nextSibling();
	while (! $next) {
		# 子ノードも兄弟ノードもなければ親の
		$node = $node->parent();
		# 親ノードがbodyに戻っていたら終了
		if ($node->tag == "body" )
			break;
		$next = $node->nextSibling();
		# 兄弟ノードが見つかるまでたどる
	}
	$node = $next;
}

echo "\n";

simple_html_domはその名の通りDOMを扱います。
なのでDOMの知識が必要です。
http://piyo-js.com/05/dom.html
http://www.ajaxtower.jp/js/dom/
http://hakuhin.jp/js/dom.html
やはりjavascriptでの説明が多いのですが、文法が若干違う程度でDOMとしては同じです。
ただ、simple_html_domはDOMのよく使う一部だけの実装なのと、独自名やjqueryの影響が見られますので、適宜読み替えなど必要です。
http://simplehtmldom.sourceforge.net/manual.htm
また、phpのもいくらか参考になります。
http://php.net/manual/ja/class.domnode.php

今後、本格的にDOMを扱う様であれば、phpのDOMのほか、SimpleXMLやXML パーサについても知っておくとお得かも知れません。
http://php.net/manual/ja/class.simplexmliterator.php
http://php.net/manual/ja/example.xml-map-tags.php

[追記]
裏技的なのを。
テキストとbodyタグと全ての閉じタグを消してしまいます。
#コメントは残るかもしれません。

<?php
require "simple_html_dom.php";
$html = file_get_html('sample1.html');

function my_callback($element) {
	if ($element->tag == "text" )
		$element->outertext = "";
	if ($element->tag == "body")
		$element->_[HDOM_INFO_BEGIN] = -1;
	$element->_[HDOM_INFO_END] = 0;
}

$html->set_callback('my_callback');
echo $html->find("body", 0);
echo "\n";
他2件のコメントを見る
id:a-kuma3

xpathとかもあるけどcssセレクタベースの方がわかりやすい。

確かに。
javascript 方面だと、document.querySelector メソッドが一番 使いやすいです。

2016/01/01 22:18:18
id:kohhi

ご丁寧な回答をいただきありがとうございます。

2016/01/03 12:00:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません