2017-10-11 119 views
0

我有一个HTML表格,格式如下:正如你所看到的,第一个标题1有一个与之相关的行1。第二个标题2有两行 - 第2行,第3行与它关联。标题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 

当我使用的解析器来获取标签,所有的人都存储在一个数组。当我执行foreach循环时,所有其他标记都存储在另一个数组中。我在循环时如何保留标题与行的关联?

+0

为什么不使用内置的DOMDocument接口? – trincot

+0

请显示您的代码。你指的是哪个foreach? – Nima

回答

1

没有看到您现有的PHP代码就很难说到底如何改变你拥有的东西。但是像这样的东西可以用于你的用例:

//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 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都会有这样的内容:

[ 
    ['Header 1', 'Row 1'], 
    ['Header 2', 'Row 2', 'Row 3'], 
    ['Header 3', 'Row 4', 'Row 5', 'Row 6'] 
]