我正在使用Windows软件来组织一个tourpool。该程序创建(除其他外)具有参与者排名的HTML页面。但是这些HTML页面非常可怕,所以我正在围绕它构建一个站点。
要显示排名前10的排名,我需要从生成的HTML文件的大约1000个参与者中选择前10个,并将其放在我自己的网站上。
为此,我使用了:
// get top 10 ranks of p_rank.html
$file_contents = file_get_contents('p_rnk.htm');
$start = strpos($file_contents, '<tr class="header">');
// get end
$i = 11;
while (strpos($file_contents, '<tr><td class="position">'. $i .'</td>', $start) === false){
$i++;
}
$end = strpos($file_contents, '<td class="position">'. $i .'</td>', $start);
$code = substr($file_contents, $start, $end);
echo $code;
这样我就可以使用它,只有最后3列(上一个位置,上下或细节)是无用的信息。所以我希望删除这些列,或者找到一种只选择并显示前4列的方法。
我如何管理?
我调整了我的代码,最后我只回显调整后的表格。
<?php
$DOM = new DOMDocument;
$DOM->loadHTMLFile("p_rnk.htm");
$table = $DOM->getElementsByTagName('table')->item(0);
$rows = $table->getElementsByTagName('tr');
$cut_rows_after = 10;
$cut_colomns_after = 3;
$row_index = $rows->length-1;
while($row = $rows->item($row_index)) {
if($row_index+1 > $cut_rows_after)
$table->removeChild($row);
else {
$tds = $row->getElementsByTagName('td');
$colomn_index = $tds->length-1;
while($td = $tds->item($colomn_index)) {
if($colomn_index+1 > $cut_colomns_after)
$row->removeChild($td);
$colomn_index--;
}
}
$row_index--;
}
echo $DOM->saveHTML($table);
?>
答案 0 :(得分:0)
我说处理这些问题的最佳方法是解析html文档(例如,参见第一个anwser here),然后操纵描述DOM的对象。这样,您可以使用各种选择器轻松地提取表本身,以更简单的方式获取您的10条第一条记录,并且还能够从每一行中删除不必要的子节点(td
)(使用removeChild )。完成修改后,使用saveHTML转储生成的HTML。
<强>更新强>
好的,这是经过测试的代码。我删除了对colomns和行的数量进行硬编码的必要性,并将所需的colomns和行数分成几个变量(这样你就可以调整它们了如果neede)。仔细查看代码:您会注意到代码中缺少的一些细节(索引是0..999,而不是1..1000,这就是为什么所有-1
和出现+1
;减少索引而不是增加索引会更好,因为在这种情况下,您不必考虑删除时的计算转移;我还使用了{{1}而不是while
而不是分别关注for
的情况:
$rows->item($row_index) == null
更新2:
如果页面不包含<?php
$DOM = new DOMDocument;
$DOM->loadHTMLFile("./table.html");
$table = $DOM->getElementsByTagName('tbody')->item(0);
$rows = $table->getElementsByTagName('tr');
$cut_rows_after = 10;
$cut_colomns_after = 4;
$row_index = $rows->length-1;
while($row = $rows->item($row_index)) {
if($row_index+1 > $cut_rows_after)
$table->removeChild($row);
else {
$tds = $row->getElementsByTagName('td');
$colomn_index = $tds->length-1;
while($td = $tds->item($colomn_index)) {
if($colomn_index+1 > $cut_colomns_after)
$row->removeChild($td);
$colomn_index--;
}
}
$row_index--;
}
echo $DOM->saveHTML();
?>
,请使用存在的容器。例如,如果tbody
元素位于tr
元素内,请使用table
代替$DOM->getElementsByTagName('table')
。