有这样一个表格
<table width="100%" border="1" cellspacing="1" cellpadding="1">
  <tr>
    <td>&nbsp;</td>
    <td><table width="100%" border="1" cellspacing="1" cellpadding="1">
      <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><table width="100%" border="1" cellspacing="1" cellpadding="1">
      <tr>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
    </table></td>
  </tr>
</table>
根据上表,生成了下面的数组,
$arr = array('<table>','<tr>','<td>','</td>','<td>','<table>','<tr>','<td>','</td>','<td>','</td>','</tr>','</table>',
'</td>','</tr>','<tr>','<td>','</td>','<td>','</td>','</tr>','<tr>','<td>','</td>','<td>','</table>','<tr>','<td>'
,'</td>','<td>','</td>','</tr>','</table>','</td>','</tr>','</table>'),然后希望根据上面的数组给每个TD标上号,生成下面的一个数组,
$ar = array();
$ar[] = array('1','1','1');
$ar[] = array('1','1','2','2');
$ar[] = array('1','2','1');
$ar[] = array('1','2','2');
$ar[] = array('1','3','1');
$ar[] = array('1','3','2','3');
$ar[] = array('2','1','1');
$ar[] = array('2','1','2');
$ar[] = array('3','1','1');
$ar[] = array('3','1','2');
其中,ar数组中,前三位分别表示表格号、行号、列号。第四位表示该单元格的嵌套表格号。弄了两天了,还是没成呀,

解决方案 »

  1.   

    用正则表达式解析table,就像模板引擎一样
      

  2.   

    第一问
    $text =<<< HTML
    <table width="100%" border="1" cellspacing="1" cellpadding="1">
      <tr>
        <td> </td>
        <td><table width="100%" border="1" cellspacing="1" cellpadding="1">
          <tr>
            <td> </td>
            <td> </td>
          </tr>
        </table></td>
      </tr>
      <tr>
        <td> </td>
        <td> </td>
      </tr>
      <tr>
        <td> </td>
        <td><table width="100%" border="1" cellspacing="1" cellpadding="1">
          <tr>
            <td> </td>
            <td> </td>
          </tr>
        </table></td>
      </tr>
    </table>
    HTML;preg_match_all('/<\/?\w+/', $text, $regs);
    $arr = array_map(create_function('$v', 'return $v.">";'), $regs[0]);
    print_r($arr);
      

  3.   

    第二问,大致如下:$table = 0;
    $tr = 0;
    $td = 0;
    foreach($arr as $v) {
      $tag = preg_replace('/[<\/]+(\w+)>/', '\\1', $v);
      if($v[1] == '/' && $tag == 'table') $$tag--;
      else {
        if($tag == 'tr') $td = 0;
        $$tag++;
        if($tag == 'td') $ar[] = array($table, $tr, $td);
      }
    }
        
    print_r($ar);