最近看网站日志,发现有人在博客上转了我不知道几年前写的一个匹配 HTML 标签的正则,刚好最近也在做一些相关的事情,顿时来了兴趣。就拿回来改改,成了下面这样,可能会有一些 case 遗漏,欢迎修改,已知在内嵌 <script> 复杂内容的处理能力较弱,不过对纯 HTML 来说已经够用,拿来做一些分析工具还是不错滴。 复制代码 代码如下: <script type="text/javascript"> var str = "<br /><br/><br><br ><中文><div><div id=a>无忧脚本<img src="http://bbs.51js.com/images/default/logo.gif" width="191" height="75" border=0 onload="if(testver>0 && testver<500)alert("test");"
onerror="alert("test")" /><img src=xxx alt="hello
just a test!"></div><hr ><script type="test/javascript" defer>alert("just a test!");</script>Hello.<input type=text value="无忧脚本"><br / ><img "" ></ ><!-- 注释 -->< ucren><!-- 再<注>释 --><img alt=" title=""" /><b>123</b>1<2<3,3<4>1<b><img src="http://bbs.51js.com/images/old51js/logo.gif" /><!-- 三注释>>> -->"; var reg = /<(?:(?:/?[A-Za-z]w*(?:[=s]([""]?)[sS]*?1)*)|(?:!--[sS]*?--))/?>/g; alert(str.match(reg).join("
----------------------------------------------------
")); </script>
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
有朋友留言说Java直接使用的话会报错。我后来查了一下,发现Java正则引擎支持的特性相对比较少。在1.6版本中不能使用命名组(貌似1.7的时候开始支持了),否则会报以下错误,更别说平衡组了。因此感觉要实现无限级的嵌套匹配不大现实。 复制代码 代码如下: java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index XX