只是一个不严谨的例子,参考一下:<BODY> <textarea id=t cols=100 rows=20></textarea> <SCRIPT LANGUAGE="JavaScript"> <!-- var st = "<table align=\"center\"><tbody><tr><td>test1</td><td>test2</td></tr><tr><td>test3</td></tr></tbody></table>"; var r = /<(\w+)(\s.*?)?>.*?<\/\1>/g var result = new Object; for (var i=0;i<st.length;i++){ s = st.substr(i).match(r); if (s) for (var j=0;j<s.length;j++) result[s[j]]=s[j]; } for (var i in result) t.value += i+"\n" //--> </SCRIPT> </BODY>
安你的意思,标签<不允许有空格(html允许有空格),再考虑到html标签<后的第一个字符应该是字母,故用[a-z];还要考虑到标签并不都是象<html>、</html>,还有象<form name="theForm"...>....</form>;还应考虑到换行,但这里假定标签名字这个单词本身不换行,如from不存在换行,(注:事实上标签名换行是允许的,象:<h换行tml>...<\换行html换行>,也是合法的html);i忽略大小写。
oPattern = /<([a-z][^\s]*)(.|\n)*?<\/\1>/i;
上面的式子并不通用,标签名字换行,以后分解,但不是在这个帖子下,今天就到这。
/<([a-z][^\s]*)(.|\n)*?<\/\1>/i它能匹配<htmlabc></html>,这不是期待的结果
alert(/<([a-z]+)>.*<\/\1>/i.test("<htmlabc></html>"))
alert(/<(\w+?)>.+?<\/\1>/.test("<htmlabc></html>"))
</script>
alert(/<([a-z]+)( .*)?>.*<\/\1>/i.test("<htmlabc></html>"))
</script>
因为HTML的标签可以有嵌套、缺省等等情况。常规表达式在定位到首标签后无法确定应该做最大匹配还是最小匹配,因此无法正确定位到尾标签。
比如说下面这个嵌套表格:
<table>
<tr>
<td>
<table>
<tr>
<td>内容</td>
</tr>
</table>
</td>
</tr>
</table>
如果要匹配<table></table>标签,用最大匹配只能匹配外层,用最小匹配则定位错误。
因此严格匹配对于HTML来说是无法实现的。
其实楼主去参考一些论坛的BBCode,如VBB,YBB等的转译程序就会明白,那些BBCode的转译程序的常规表达式都是只针对等单个标签解释,没有一个是严格匹配的,否则必定错误百出。
emu(ston) :
<(.*?)>.*?<\/\1>
能匹配< ></ >其中空格是制表符,不对,(csdn检查回复不能为空的时候也忽略了制表符)bencalie(Bencalie):
/<([a-z]+)>.*<\/\1>/i
好像没有问题,可是我不太懂,后面的\1是什么意思?<([a-z]+)( .*)?>.*<\/\1>
这个是考虑了属性和嵌套,是么?它虽然
能匹配<font size="10"><b>女人</b></font>
但是它也能匹配<font size="10" <b></b>><b>女人</b></font>
应该也是有问题吧
emu(ston) :
<(.*?)>.*?<\/\1>
能匹配< ></ >其中空格是制表符,不对,(csdn检查回复不能为空的时候也忽略了制表符)
-------------------------------------------------/<(\S*?)(\s.*?)?>.*?<\/\1>/g如何?不过这样做<></>可以通过。
alert(r.test("<aa>test</aa>"));
alert(r.test("<aa emu=ston disabled>test again</aa>"));
alert(r.test("<ab>test</aa>"));
body,td,a,p,.h{font-family:arial,sans-serif;}
.h{font-size: 20px;}
.q{text-decoration:none; color:#0000cc;}
//-->
</style>
<script>
<!--
function sf(){document.f.q.focus();}
function c(p,l,e){var f=document.f;if (f.action && document.getElementById) {var hf=document.getElementById("hf");if (hf) {var t = "<input type=hidden name=tab value="+l+">";hf.innerHTML=t;}f.action = 'http://'+p;e.cancelBubble=true;f.submit();return false;}return true;}
// -->
</script>
</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onLoad=sf()><center><table border=0 cellspacing=0 cellpadding=0><tr><td><img src="/intl/zh-CN_ALL/images/logo.gif" width=286 height=110 alt="Google"></td></tr></table><br><table border=0 cellspacing=0 cellpadding=0><tr><td width=15> </td><td id=0 bgcolor=#3366cc align=center width=120 nowrap><font color=#ffffff size=-1><b>鎵€鏈夌綉绔?/b></font></td><td width=15> </td><td id=1 bgcolor=#efefef align=center width=120 nowrap onClick="return c('www.google.com/imghp','wi',event);" style=cursor:pointer;cursor:hand;><a id=1a class=q href="/imghp?hl=zh-CN&tab=wi&ie=UTF-8&oe=UTF-8" onClick="return c('www.google.com/imghp','wi',event);"><font size=-1>鍥惧儚</font></a></td><td width=15> </td><td id=2 bgcolor=#efefef align=center width=120 nowrap onClick="return c('www.google.com/grphp','wg',event);" style=cursor:pointer;cursor:hand;><a id=2a class=q href="/grphp?hl=zh-CN&tab=wg&ie=UTF-8&oe=UTF-8" onClick="return c('www.google.com/grphp','wg',event);"><font size=-1>缃戜笂璁哄潧</font></a></td><td width=15> </td><td id=3 bgcolor=#efefef align=center width=120 nowrap onClick="return c('www.google.com/dirhp','wd',event);" style=cursor:pointer;cursor:hand;><a id=3a class=q href="/dirhp?hl=zh-CN&tab=wd&ie=UTF-8&oe=UTF-8" onClick="return c('www.google.com/dirhp','wd',event);"><font size=-1>缃戦〉鐩綍</font></a></td><td width=15> </td></tr><tr><td colspan=10 bgcolor=#3366cc><img width=1 height=1 alt=""></td></tr></table><br><form action="/search" name=f><span id=hf></span><table cellspacing=0 cellpadding=0><tr valign=middle><td width=75> </td><td align=center><input maxLength=256 size=55 name=q value="">
<script>
document.f.q.focus();
</script>
<input type=hidden name=ie value="UTF-8"><input type=hidden name=oe value="UTF-8"><input name=hl type=hidden value=zh-CN><br><input type=submit value="Google鎼滅储" name=btnG><input type=submit value="鎵嬫皵涓嶉敊" name=btnI></td><td valign=top nowrap><font size=-1> • <a href=/advanced_search?hl=zh-CN>楂樼骇鎼滅储</a><br> • <a href=/preferences?hl=zh-CN>浣跨敤鍋忓ソ</a><br> • <a href=/language_tools?hl=zh-CN>璇█宸ュ叿</a></font></td></tr><tr><td colspan=3 align=center><font size=-1><input type=radio name=lr value="" checked>鎼滅储鎵€鏈夌綉绔?input type=radio name=lr value=lang_zh-CN|lang_zh-TW >鎼滅储鎵€鏈変腑鏂囩綉椤?input type=radio name=lr value=lang_zh-CN >鎼滅储绠€浣撲腑鏂囩綉椤?/font></td></tr></table></form><p><font size=-1><p></font><br><br><font size=-1><a href=/intl/zh-CN/about.html>Google 澶у叏</a> - <b><a href=http://www.google.com/ncr>Google.com in English</a></b><span id=hp style="behavior:url(#default#homepage)"></span>
<script>
//<!--
if (!hp.isHomePage('http://www.google.com/')) {document.write("<p><a href=\"/mgyhp.html\" onClick=\"style.behavior='url(#default#homepage)';setHomePage('http://www.google.com/');\">灏?Google 璁句负棣栭〉锛?/a>");}
//-->
</script></font><p><font size=-1>©2003 Google - 鎼滅储 3,083,324,652 寮犵綉椤?/font></p></center></body></html><script>
re = /<(\w+)(.*?)?>(.*?)<\/\1>/ig;
ar = document.body.innerHTML.match(re);
for(i=0;i<ar.length;i++)
document.write(i+":: "+ar[i].replace(/</,"<")+"<br>")
</script>
emu(ston):
<([a-z]+)( [^<>/]*)?>.*<\/\1>
能匹配不合法<font size="7>">ddddd</font>等emu(ston):
/<(\S*?)(\s.*?)?>.*?<\/\1>/g
除了你已经意识到的<></>外,它还能匹配不合法的<font <br>>女人</font>等:(真的佷郁闷
永远都不要试图把“世界”放在某个规则里去。如果可能的话,你我也就没有在这里发议论的可能了。楼主的要求不是不能解决的,只是说不能企图用一个简单的式子来解决,而是把复杂的问题简单化。
比如,若将html从允许的不封闭标签处分割,则每个片段还是有可能用正则匹配的。
<table align="center"><tr><td><table><tr><td>内容1</td></tr></table></td></tr></table>
要求列出下列结果:
<table align="center"><tr><td><table><tr><td>内容1</td><td>内容2</td></tr></table></td></tr></table>
<tr><td><table><tr><td>内容1</td><td>内容2</td></tr></table></td></tr>
<td><table><tr><td>内容</td><td>内容2</td></tr></table></td>
<table><tr><td>内容</td><td>内容2</td></tr></table>
<tr><td>内容</td><td>内容2</td></tr>
<td>内容1</td><td>内容2</td>
<td>内容1</td>
<td>内容2</td>
<textarea id=t cols=100 rows=20></textarea>
<SCRIPT LANGUAGE="JavaScript">
<!--
var st = "<table align=\"center\"><tbody><tr><td>test1</td><td>test2</td></tr><tr><td>test3</td></tr></tbody></table>";
var r = /<(\w+)(\s.*?)?>.*?<\/\1>/g
var result = new Object;
for (var i=0;i<st.length;i++){
s = st.substr(i).match(r);
if (s) for (var j=0;j<s.length;j++) result[s[j]]=s[j];
}
for (var i in result)
t.value += i+"\n"
//-->
</SCRIPT>
</BODY>