PHP:简单的HTML Dom解析器 - 解析带有标题/不均匀正文行的HTML表格
我有一个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循环时,所有其他标记都存储在另一个数组中。我在循环时如何保留标题与行的关联?
没有看到您现有的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以达到其他原因。
谢谢,它工作完美。 @ trincot的解决方案也起作用。 – user972391
您可以使用标准的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']
]
为什么不使用内置的DOMDocument接口? – trincot
请显示您的代码。你指的是哪个foreach? – Nima