我觉得这个这种问题还是用DOM规则查找来得好些。

解决方案 »

  1.   

    <table id=mm border=1 width=500>
      <tr>
        <td>1123</td>
        <td>1456</td>
        <td>1789</td>
      </tr>
      <tr>
        <td>2123</td>
        <td>2456</td>
        <td>2789</td>
      </tr>
      <tr>
        <td>123</td>
        <td>456</td>
        <td><table border=1><tr><td>table</td></tr></table></td>
      </tr>
    </table>
    <input type=button value=ok onclick="meizz()">
    <SCRIPT LANGUAGE="JavaScript">
    function meizz()
    {
      var tab = document.getElementById("mm");
      for(var y=0; y<tab.rows.length; y++)
      {
        for(var x=0; x<tab.rows[y].cells.length; x++)
        {
          alert("第 "+ (y+1) +" 行第 "+ (x+1) +" 列的数据是 "+ tab.rows[y].cells[x].innerHTML);
        }
      }
    }
    </SCRIPT>
      

  2.   

    to: meizz(梅花雪)
    我要的不是这种效果,表格结构是未知的,可能有一层也可能有多层,也就是说是一个html代码文件,我要分析出来它里面的表格结构,并获取到每一个完整的表格结构,实际中不定层表格嵌套时,会找错结束标记,请问该如何处理??
      

  3.   

    所以不能通过这种循环用innerHTML取得,我想用正则匹配,但单层时匹配没问题,不定层表格嵌套时就会找错,实在是郁闷。
      

  4.   

    参考JAVA的开源项目common-digester,这是一个用来解析xml文档到java bean的工具,它的解析原理是:利用栈这种数据结构,以楼主的需求为例,每当找到一个<table>时,将它压入栈里;每当找到一个</table>时,就从栈里弹出一个<table>,依此类推,这样就可以从最内层的table一直匹配到最外层的table。
      

  5.   

    charmguy(新新四军) 
    说得很对,用 栈+ 一个关键字列表 解析一段字符串是肯定可以的做到的
      

  6.   

    DHTML 的 DOM 模式就是类似于XMLDOM的解析模式,我写出的代码只是说是直接使用了DHTML里的方法,其它你自己也可以使用 childNodes nextSibling firstChild parentNode 等等方式去解析你的HTML代码的。
      

  7.   

    to:charmguy(新新四军)
    我没接触过java,想通过正则解析,有办法吗??to: meizz(梅花雪)
    不好意思,我对js不是很熟悉,能帮我弄个例子吗??
      

  8.   

    这个正则很长,也没什么实用意义,不过你想要我就帖一下。
    取得某层的table的正则如下:$str=....你上面的表格
    $div=0;
    preg_match_all("/<table>(?=(((.*?<table>){".$div."})))\\1(?!(.*?)(?=<table>))(.*?)(?=((.*?<\/table>){".$div."}))\\6.*?<\/table>/si",$str,$ar);其中$div是要取得嵌套的层数。比如$div=0,将取得最里层的table。$div=1则取得内嵌有一个table的table。你可以循环从0开始取,一直取到没有匹配为止就取得所有的table的正确匹配了。
      

  9.   

    哦。你可以放弃用正则实现这个了。我改成script后,只能取得div=0和div=1的。div=2时,一运行,ie就报错崩溃了……在php里倒是可以正常运行。
      

  10.   

    支持任意层嵌套很困难,支持有限层还是有办法的:(1) 首先我们找到最里层,也就是不再嵌套的那一层:
    <table>([^<]|<(?!/?table>))*</table>(2) 找到嵌套的规律:
    <table>([^<]|<(?!/?table>)|xxxxx)*</table>
    里面层就放在 xxxxx 的位置(3) 循环得到多层 table 的表达式
    String pattern = "<table>([^<]|<(?!/?table>))*</table>";pattern = "<table>([^<]|<(?!/?table>)|" + pattern + ")*</table>";
    pattern = "<table>([^<]|<(?!/?table>)|" + pattern + ")*</table>";
    pattern = "<table>([^<]|<(?!/?table>)|" + pattern + ")*</table>";
    pattern = "<table>([^<]|<(?!/?table>)|" + pattern + ")*</table>";
    pattern = "<table>([^<]|<(?!/?table>)|" + pattern + ")*</table>";
    .....这样就得到可以匹配 n 曾嵌套的表达式。(4) 使用方法:(假设 n 足够你要匹配的 table 层数)var re = new RegExp(pattern, "gi");re 的 exec 方法得到了返回值 matches,
    matches[0] 就是第一个最外层的 table,matches.index 和 matches.lastIndex 就是位置。下一个 table:然后将 re.lastIndex 设定为 matches.index + 7  (7就是"<table>"的长度),再次 exec,这次得到的 matches[0] 这个 table 有可能被刚才第一个嵌套,有可能是没有被第一个嵌套。如果 matches == null 那么就没有 table 了。(5) 说明一下:
    太多的"非贪婪"匹配效率不高,尽量采用"预搜索不匹配"+"贪婪"的方法。
      

  11.   

    如果是用php的4.3.3以上版本是可以做到支持任意层嵌套的。js就没办法了。
      

  12.   

    因为php里的正则支持递归匹配。js里好象没有递归匹配这一说法。