100求一简单正则表达式应用 我觉得这个这种问题还是用DOM规则查找来得好些。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <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> to: meizz(梅花雪)我要的不是这种效果,表格结构是未知的,可能有一层也可能有多层,也就是说是一个html代码文件,我要分析出来它里面的表格结构,并获取到每一个完整的表格结构,实际中不定层表格嵌套时,会找错结束标记,请问该如何处理?? 所以不能通过这种循环用innerHTML取得,我想用正则匹配,但单层时匹配没问题,不定层表格嵌套时就会找错,实在是郁闷。 参考JAVA的开源项目common-digester,这是一个用来解析xml文档到java bean的工具,它的解析原理是:利用栈这种数据结构,以楼主的需求为例,每当找到一个<table>时,将它压入栈里;每当找到一个</table>时,就从栈里弹出一个<table>,依此类推,这样就可以从最内层的table一直匹配到最外层的table。 charmguy(新新四军) 说得很对,用 栈+ 一个关键字列表 解析一段字符串是肯定可以的做到的 DHTML 的 DOM 模式就是类似于XMLDOM的解析模式,我写出的代码只是说是直接使用了DHTML里的方法,其它你自己也可以使用 childNodes nextSibling firstChild parentNode 等等方式去解析你的HTML代码的。 to:charmguy(新新四军)我没接触过java,想通过正则解析,有办法吗??to: meizz(梅花雪)不好意思,我对js不是很熟悉,能帮我弄个例子吗?? 这个正则很长,也没什么实用意义,不过你想要我就帖一下。取得某层的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的正确匹配了。 哦。你可以放弃用正则实现这个了。我改成script后,只能取得div=0和div=1的。div=2时,一运行,ie就报错崩溃了……在php里倒是可以正常运行。 支持任意层嵌套很困难,支持有限层还是有办法的:(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) 说明一下:太多的"非贪婪"匹配效率不高,尽量采用"预搜索不匹配"+"贪婪"的方法。 如果是用php的4.3.3以上版本是可以做到支持任意层嵌套的。js就没办法了。 因为php里的正则支持递归匹配。js里好象没有递归匹配这一说法。 个性化日期控件求助!!! div浮动层与footer相对位置滑动问题(之前的类似问题没有表达清楚的延续) jquery-jstree的一个小问题 如何使用javascript控制回退的页数 [分享]风声Javascript菜单类——预览版 [ 原创 ]第一次在js版发贴,模仿IE自动完成功能,支持Firefox. 新手提问:很简单的问题 神啊,救救我吧~~一把年纪了,连个select option都搞不定. inertRow,inertCell应该怎么用啊? 为什么以下函数无法防止输入汉字,怎样解决? 在线等JS函数问题 重赏:屏蔽ALT+Home
<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>
我要的不是这种效果,表格结构是未知的,可能有一层也可能有多层,也就是说是一个html代码文件,我要分析出来它里面的表格结构,并获取到每一个完整的表格结构,实际中不定层表格嵌套时,会找错结束标记,请问该如何处理??
说得很对,用 栈+ 一个关键字列表 解析一段字符串是肯定可以的做到的
我没接触过java,想通过正则解析,有办法吗??to: meizz(梅花雪)
不好意思,我对js不是很熟悉,能帮我弄个例子吗??
取得某层的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的正确匹配了。
<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) 说明一下:
太多的"非贪婪"匹配效率不高,尽量采用"预搜索不匹配"+"贪婪"的方法。