呵呵,用了比较复杂的算法
<?php
$html = '
<table width="493" height="161" border="1">
  <tr> 
    <td colspan="2" rowspan="2"><div align="center">a</div></td>
    <td colspan="2"><div align="center">b</div></td>
    <td rowspan="2"><div align="center">e</div></td>
    <td rowspan="2"><div align="center">f</div></td>
  </tr>
  <tr> 
    <td><div align="center">c</div></td>
    <td><div align="center">d</div></td>
  </tr>
  <tr> 
    <td rowspan="2"><div align="center">g</div></td>
    <td rowspan="2"><div align="center">h</div></td>
    <td><div align="center">i</div></td>
    <td><div align="center">j</div></td>
    <td><div align="center">k</div></td>
    <td><div align="center">l</div></td>
  </tr>
  <tr> 
    <td><div align="center">m</div></td>
    <td><div align="center">n</div></td>
    <td><div align="center">o</div></td>
    <td><div align="center">p</div></td>
  </tr>
  <tr> 
    <td colspan="2"><div align="center">q</div></td>
    <td><div align="center">r</div></td>
    <td><div align="center">s</div></td>
    <td><div align="center">t</div></td>
    <td><div align="center">u</div></td>
  </tr>
</table>
';// 整理数据
$html = eregi_replace(">[\r\n\t ]+<","><",$html); // 去掉多余的空字符
eregi("<table[^>]*>(.+)</table>",$html,$regs); // 提取表体
$ar = split("</tr>",$regs[1]); // 按行分解成数组
array_pop($ar); // 去处尾部多余的元素
for($i=0;$i<count($ar);$i++) {
  $ar[$i] = split("</td>",$ar[$i]); // 分裂各列
  array_pop($ar[$i]); // 去处尾部多余的元素
}
for($i=0;$i<count($ar);$i++) {
  for($j=0;$j<count($ar[$j]);$j++) {
    if(eregi("colspan.*([0-9]+)",$ar[$i][$j],$regs)) { // 如果跨列
      $t = array();
      while(--$regs[1] > 0) // 补足差额
        array_push($t,"");
      $ar[$i] = array_merge(array_slice($ar[$i],0,$j+1),$t,array_splice($ar[$i],$j+1));
    }
    if(eregi("rowspan.*([0-9]+)",$ar[$i][$j],$regs)) { // 如果跨行
      if(! isset($t)) // 跨列、跨行不同时存在
        $t = array("");
      else
        array_push($t,"");
      $k = $regs[1];
      while(--$k > 0) // 补足差额
        $ar[$i+$k] = array_merge(array_slice($ar[$i+$k],0,$j),$t,array_splice($ar[$i+$k],$j));
    }
    unset($t);
  }
}// 除去html标记
for($i=0;$i<count($ar);$i++) {
  while(count($ar[$i]) < count($ar[0])) // 保证各行的列相同,这里有点牵强
    array_push($ar[$i],"");
  for($j=0;$j<count($ar[$i]);$j++)
    $ar[$i][$j] = strip_tags($ar[$i][$j]);
}
?>
<pre>
<?php
print_r($ar);
?>
</pre>