2017-10-11 17 views
0

私は以下のフォーマットのHTMLテーブルを持っています:ご覧のとおり、最初のヘッダー1には1つの行1が関連付けられています。 2番目のヘッダー2には、行2、行3が関連付けられた2つの行があります。ヘッダー3には、行4、行5、行6が関連付けられています。PHP:シンプルなHTML Domパーサ - ヘッダー/不均一なボディ行を持つHTMLテーブルを解析します

<table> 
<thead> 
    <tr> 
     <th>Header 1</th> 
    </tr> 
</thead> 
<tbody> 
     <tr> 
      <td> 
       Row 1 
      </td> 
     </tr> 
</tbody> 
<thead> 
    <tr> 
     <th>Header 2</th> 
    </tr> 
</thead> 
<tbody> 
     <tr> 
      <td> 
       Row 2 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Row 3 
      </td> 
     </tr> 

</tbody> 
<thead> 
    <tr> 
     <th>Header 3</th> 
    </tr> 
</thead> 
<tbody> 
     <tr> 
      <td> 
       Row 4 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Row 5 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Row 6 
      </td> 
     </tr> 
</tbody> 

私は、次のようなデータを取得するためにPHPの簡単なHTML DOMパーサーを使用したい:私はタグを取得するためにパーサーを使用する場合

Header 1, Row 1 
Header 2, Row 2, Row 3 
Header 3, Row 4, Row 5, Row 6 

、それらのすべてが中に保存されています1つのアレイ。 foreachループを実行すると、他のタグはすべて別の配列に格納されます。私がループしているときに、ヘッダーと行との関連付けを保持するにはどうすればよいですか?

+0

組み込みのDOMDocumentインターフェイスを使用しない理由は何ですか? – trincot

+0

コードを表示してください。どのforeachを参照していますか? – Nima

答えて

1

言い難いですどのようにあなたが持っているものを変更するか。しかし、このような何かがあなたのユースケースのために働くだろう:

//Assuming $html has been set to your html block 
$heads = $html->find('thead'); 
$result = array(); 

foreach($heads as $head){ 
    $headerText = $head->find('th')[0]->innerText; 
    $result[$headerText] = array(); 
    $rows = $head->next_sibling()->find('td'); 
    foreach($rows as $row){ 
     $result[$headerText][] = $row->innerText; 
    } 
} 

//Output 
foreach($result as $header => $rows){ 
    echo $header . ': ' . implode(',', $rows); 
} 

いくつかの注意点を、上記のあなたが何をしたいのかの簡単な例です。これはかなり単純な実装です。例えば。与えられたtheadはちょうど1正確に1 thを持つと仮定します。

また、エコーするのが本当にやりたければ、解析ループに直接エコーする方が効率的です。私はあなたが単に画面にそれをプリントアウトする以上のことをしたいと思っているので、出力を分けました。

ネイティブのDOMパーサーを使用してこのようなことを行うのはかなり簡単でしょう。他の理由で単純なhtml domを使用する必要があると仮定しています。

+0

ありがとう、それは完全に働いた。 @ trincotのソリューションも同様に機能しました。 – user972391

1

これを行うには、標準のDOMDocumentインターフェイスを使用できます。あなたのHTMLを変数$htmlに格納されている場合は、操作を行います。

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
foreach ($dom->getElementsByTagName('tr') as $row) { 
    if ($row->parentNode->tagName === 'thead') $arr[] = []; 
    $arr[count($arr)-1][] = trim($row->textContent); 
} 

上記を実行した後は、変数$arrは、このコンテンツがあります:既存のPHPコードを見ることなく

[ 
    ['Header 1', 'Row 1'], 
    ['Header 2', 'Row 2', 'Row 3'], 
    ['Header 3', 'Row 4', 'Row 5', 'Row 6'] 
] 
関連する問題