在工作中,经常需要对网页上的表格内容进行处理,但是,由于表格内容制作过程中的随意性,跨行跨列经常发生,所以我作了这几个函数,以获取表格的内容,程序中重要的地方已作了注解,所以在此不再重复说明,经过测试,非常成功.所以拿出来供大家共享.
<?php
//作者: 王朋武
//日期: 2005,3,31
//目的: 获取网页上(任意跨行跨列的)表格中的内容
function fun_proc_rowspan($l_str)
{
$l_a = explode("\n", $l_str);
for($i=count($l_a)-1; $i>=0; $i--) {
$l_str = trim($l_a[$i]);
if(empty($l_str)) continue;
$l_str = eregi_replace("<td", "<b><td", $l_str);
$l_b = explode("<b>", $l_str); //如有n个<b>,则分成(n+1)个组,最开始一项为空.
for($j=0; $j<count($l_b); $j++) { /*不能反过来(即从右开始),否则在有些情况下会有错误,因为在表格的一行中如有几个连续的格跨行,则必须从左开始,否则下一行的列数就可能不够计算,即计算跨行时保存的列有可能大于下一行的总列数, 则操作就不会成功. 实测也证明.
如 +----+----+----+----+----+----+----+
+----+----+----+----+----+----+----+此一行保存7格, 前6格都有rowspan=2
+-----------------------------+----+此一行只保存2格
+----------------------------------+此一行只保存1格
*/
$l_str = trim($l_b[$j]);
if(eregi("rowspan", $l_str)) {
$rowspan = preg_replace("/^<td.+rowspan=[\"\']?(\d{1,2})[\"\']?.*/", "
\\1", $l_str);
$rowcont = preg_replace("/^<td.+rowspan=[\"\']?\d{1,2}[\"\']?.*>(.+)<\/td>/", "
\\1", $l_str);
$l_a = fun_add_row_td($l_a, $i, $j, $rowspan, $rowcont);
$l_str = implode("\n", $l_a);
return $l_str;
}
}//end of for j
}//end of for i
return $l_str;
}
function fun_add_row_td($l_a, $r, $l, $add_n, $add_cont) //l_a是数组, r是插入的开始行,l是开始的列, add_n是跨多少行, add_cont是加的内容
{
for($i=$r; $i<$r+$add_n; $i++) {
if($i == $r) {
$l_str = eregi_replace("<td", "<b><td", $l_a[$i]);
$l_b = explode("<b>", $l_str);
$l_c = "";
for($j=1; $j<count($l_b); $j++) {
if($j == $l) $l_c .= eregi_replace("rowspan", "", $l_b[$j]); //去掉rowspan
else $l_c .= $l_b[$j];
}
$l_a[$i] = $l_c;
continue;
}
$l_str = eregi_replace("<td", "<b><td", $l_a[$i]); //加<b>分隔符
$l_b = explode("<b>", $l_str); //以<b>分组
$l_c = "";
for($j=1; $j<$l+$add_n; $j++) { //略过开始的空项,从1开始
if($j == $l) {
$l_c .= "<td>".$add_cont."</td>";
}
$l_c .= $l_b[$j];
}//end of for j
$l_a[$i] = $l_c; //更新后的新内容
}//end of for i
return $l_a;
}
function fun_proc_colspan($l_str)
{
$l_a = explode("\n", $l_str);
for($i=0; $i<count($l_a); $i++) {
$l_str = trim($l_a[$i]);
if(empty($l_str)) continue;
$l_str = eregi_replace("<td", "<b><td", $l_str);
$l_b = explode("<b>", $l_str); //如有n个<b>,则分成(n+1)个组,最开始一项为空.
for($j=1; $j<count($l_b); $j++) { //此处不能反过来,必须从左到右取表格内容
$l_str = trim($l_b[$j]);
if(eregi("<td.+colspan", $l_str)) {
$colspan = preg_replace("/^<td.+colspan=[\"\']?(\d{1,2})[\"\']?.*/", "
\\1<