http://q.hatena.ne.jp/1447331924

の関連の質問です。

tableタグ(sampleでは「まみむめも」)の中に、
<table><tr><td>の中に<ul><li>タグがあった場合、

[Subject]:まみむめも
[Contents]:まみむめもの左の1
[Subject]:まみむめも
[Contents]:まみむめもの右の1
[Subject]:まみむめも
[Contents]:まみむめもの左の2

のようにしたいのですが。

もし<table>タグだったら、1つ前のhタグをとっておいて、
liタグの[Subject]:に入れる

というような処理になるのだと思います。

$item = $e->parent();
$e = $p->prev_sibling();
の使い方がよくわからないのかもしれません。

「1447331924」の対象を「sample13.html」に変えて
プログラムを変更してもらえると大変助かります。
よろしくお願いします。

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

ベストアンサー

id:a-kuma3 No.1

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

ポイント300pt

前の質問の回答のコードを手直ししてみました。

<?php
require "simple_html_dom.php";

$html = ...

function text_content($e) {
    $s = '';
    while ($e != null && preg_match('/^H[1234]/i', $e->tag)) {
        $s = $e->plaintext . ($s == '' ? '' : ' & ') . $s;
        $e = $e->prev_sibling();
    }
    return $s;
}

function printout($breadcrumb, $bottom_content, $n) {
    echo $n . '.[Subject]:' . implode(' > ', array_map("text_content", $breadcrumb)) . '<br>';
    echo $n . '.[Contents]:' . $bottom_content->plaintext . '<br>';
}

$n = 1;
$ul_list = $html->find('UL');
foreach ($ul_list as $ul) {
    $ul_child = $ul->find('UL');
    if (count($ul_child) == 0) {
        $li_list = $ul->find('LI');
        foreach ($li_list as $item) {
            $bottom_content = $item;
            $route = array();
            $limit = 100;
            while ($item->tag == 'li') {
                $limit = $limit - 1;
                $p = $item->parent();       // 多分 UL
                if ($p->tag == "body") {    // 念のため
                    break;
                }
                // UL の前にある要素
                $e = $p->prev_sibling();
                // もし、あれば、多分 H*
                if ($e) {
                    if (preg_match('/^H[1234]/i', $e->tag)) {
                        $route[] = $e;
                    }
                // なければ、TABLE の中かも
                } else {
                    // TABLE まで上に向かう
                    $e = $p->parent();
                    while ($e->tag != "table") {
                        $e = $e->parent();
                    }
                    // TABLE の前にある要素
                    $e = $e->prev_sibling();    // 多分、H*
                    if (preg_match('/^H[1234]/i', $e->tag)) {
                        $route[] = $e;
                    }
                }
                $item = $e->parent();
            }
            $breadcrumb = array_reverse($route);

            printout($breadcrumb, $bottom_content, $n);
            $n = $n + 1;
        }
    }
}


?>

ブラウザ上の見た目として、左→右とたどれば、「左の1」、「右の1」、一段下に降りて、「左の2」、「右の2」とたどることになりますが、HTML 上は「左の1」、「左の2」と続いているので、それの順番で出力されます。


Phpfiddle で試した結果です。
http://phpfiddle.org/lite/code/02jk-wduu

id:kohhi

早速やっていただきありがとうございます。助かりました。いつもすいません。

2015/12/19 21:16:55

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

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

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

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

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