显示外部表的前4列

时间:2016-06-13 15:32:24

标签: php html css

我正在使用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);

?>

1 个答案:

答案 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')