3

私はまだPHPの単純なDOMを学習していて、不可解なシナリオに遭遇しました。必要なものを指定するために実際に使用する一意のタグはありません。すべてタグが山ほどあり<a>ます。それらがコメントの間にグループ化されているという事実を除いて。

私がする場合

foreach($html->find('comment a') as $a){
    $articles[] = array($a->href,$a->innertext);
}

私はたくさんのものを手に入れます。1 番目と 2 番目のコメントの間、3 番目と 4 番目などの間のすべての<a>タグが必要であることを指定する方法はありますか。または、DOM は、HTML が混乱しているような状況で使用するのに最適なものではありません。

スニペット:

<! FIRST COLUMN STARTS HERE>
<center><table CELLPADDING="3" WIDTH="100%"><tr>
<td ALIGN="LEFT" VALIGN="TOP" WIDTH="30%"><tt><b>
<A HREF="http://foo.bar">Text text text...</A><BR><BR>

ありがとう

4

1 に答える 1

0

これは可能ですが、ネストではなくタグの順序を考慮する方がよい場合があります。

$articles = array(array());
foreach($html->find('comment, a') as $a) {
    if ($a->nodetype == HDOM_TYPE_COMMENT) {
        $articles[] = array();
    } else {
        $articles[count($articles) - 1][] = array($a->href,$a->innertext);
    }
}

この (かなり大雑把な) コードは、配列の配列を作成します。1 つ<a>は最初のコメントの前の任意の s 用で、1 つは各コメント用です。各配列には、そのコメントと次のコメントの間に表示されるリンクの数に応じて、0 個以上の記事が含まれます。

ところで、このコードは、提供されたコード スニペットでは機能しません。そこにあるコメントは、それぞれとではなく で始まり、<!で終わるためです。コメントが実際の HTML マークアップに正しく表示されると仮定しています。><!---->

編集:わかりました、スニペットにある「コメント」が見つかりました。この場合、simplehtml は<!"unknown" で始まる他のすべてのタグを呼び出しているようです。したがって、上記のコードにそれを追加すると、リンクの配列が得られます。

$articles = array(array());
foreach($html->find('comment, unknown, a') as $a) {
    if (in_array($a->nodetype, array(HDOM_TYPE_COMMENT, HDOM_TYPE_UNKNOWN))) {
        $articles[] = array();
    } else {
        $articles[count($articles) - 1][] = array($a->href,$a->innertext);
    }
}
于 2013-01-23T12:35:28.083 に答える