Java/Js下使用正则表达式匹配嵌套Html标签
转自:http://www.jb51.net/article/24422.htm
以前写过一篇文章讲解如何使用正则表达式完美解决Html嵌套标签的匹配问题(使用正则表达式匹配嵌套Html标签),但是里头用到了平衡组这样的高级特性,貌似只有DotNet还有Perl正则引擎支持,因此通用性不高。
通用 HTML 标签区配正则
最近看网站日志,发现有人在博客上转了我不知道几年前写的一个匹配 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');\" \n onerror='alert(\"test\")' /><img src=xxx alt=\"hello\njust 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*\b(?:[=\s](['"]?)[\s\S]*?\1)*)|(?:!--[\s\S]*?--))\/?>/g;
alert(str.match(reg).join("\n----------------------------------------------------\n"));
</script>
有朋友留言说Java直接使用的话会报错。我后来查了一下,发现Java正则引擎支持的特性相对比较少。在1.6版本中不能使用命名组(貌似1.7的时候开始支持了),否则会报以下错误,更别说平衡组了。因此感觉要实现无限级的嵌套匹配不大现实。
java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index XX
在网上搜了好久也没找到完美的解决方案。不过,我们可以实现有限级Html嵌套标签匹配。思路相对于无限级来说就简单了好多,不需要那么多高级的特性。
示例:
<div id='container'><BR> <div style='background-color:gray;' id='footer'><BR> <a id='gotop' href='#' onclick='MGJS.goTop();return false;'>Top</a><BR> <a id='powered' href='http://wordpress.org/'>WordPress</a><BR> <div id='copyright'><BR> Copyright © 2009 简单生活 —— Kevin Yang的博客<BR> </div><BR> <div id='themeinfo'><BR> Theme by <a href='http://www.neoease.com/'>mg12</a>. Valid <a href='http://validator.w3.org/check?uri=referer'>XHTML 1.1</a><BR> and <a href='http://jigsaw.w3.org/css-validator/'>CSS 3</a>.<BR> </div><BR> </div><BR></div>
在上面这个示例中,我们打算匹配id为footer的这个嵌套div,而且假设我们预先知道footer这个div里面最多只会嵌套一级div。更多级的情况我们一会儿再讲。
footer的开始和结束标签匹配很简单:
<div [^>]*id='footer'[^>]*>......(这里的省略号是一会要填写的)</div>
夹在开始和结束标签之间的内容无非有两种情况:
内容A: div标签,并且此div内无嵌套div
内容B: 任意其他内容
然后就是这两种内容的不断重复而已。正则表示如下:
(<div[^>]*>.*?</div>|.)*?
注意最后面的问号必须要加上,否则由于正则的贪婪匹配特性,footer的闭合标签会匹配失误。
OK了,匹配最多嵌套一级div的正则表达式如下:
<div [^>]*id='footer'[^>]*>(<div[^>]*>.*?</div>|.)*?</div>
那么如果footer标签里头最多会嵌套两级div的话怎么办呢?
其实也不难,我们只需要把上面的“内容A”部分中的点号稍作替换即可。修改如下:
<div [^>]*id='footer'[^>]*>(<div[^>]*>(<div[^>]*>.*?</div>|.)*?</div>|.)*?</div>
到这里你可能就知道,如果要匹配最多嵌套三级div的话,正则应该怎么写了:
<div [^>]*id='footer'[^>]*>(<div[^>]*>(<div[^>]*>(<div[^>]*>.*?</div>|.)*?</div>|.)*?</div>|.)*?</div>
所以实际上,只要你的html结构不是特别复杂的话,也就是说嵌套不会很深的话,那么你完全可以使用这种方式来匹配嵌套html标签。
这个正则在Java和Javascript中都可以使用,因为它没有用到任何高级特性。
Java/Js下使用正则表达式匹配嵌套Html标签的更多相关文章
- js如何使用正则表达式实现过滤HTML标签?(/<[^<>]+>/g)
js如何使用正则表达式实现过滤HTML标签?(/<[^<>]+>/g) 一.总结 js进阶正则表达式实现过滤HTML标签(<>标签中不能包含标签实现过滤HTML标签 ...
- Java实现 LeetCode 10 正则表达式匹配
10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配, ...
- 正则表达式匹配完整img标签php实现
处理html富文本的时候,碰到批量处理img标签,要把img标签格式化,并且去除不用的代码,class,各种data-等,首先想到使用正则匹配,然后处理匹配到的img标签和参数,经过一番尝试终于搞定了 ...
- Java实现简单的正则表达式匹配
import java.util.regex.Pattern; public class Test_REG { public static void main(String[] args) { //只 ...
- JS正则表达式匹配<div><style>标签
测试字符串: <style>v\:* { BEHAVIOR: url(#default#VML) } o\:* { BEHA ...
- asp.net正则匹配嵌套Html标签
废话不多说,直接代码 1.要匹配的html代码 <div class="conItem" id="footer"> <a id="g ...
- js正则表达式匹配字符串与优化过程
前言 有时候需要实现对js源文件中的url字符串做拦截预处理,或者前端js语法高亮,或者需要对动态加载的关键源码做混淆保护,在某些步骤实现之前,有一个步骤是需要提炼出所有的合法字符串. 目标:检测源文 ...
- 【Java】 剑指offer(19) 正则表达式匹配
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符 ...
- 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)
source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...
随机推荐
- call_user_func_array使用原型
If you need to call object and class methods in PHP < 4.0.4, the following code ought to do the t ...
- Jump Game | & ||
Jump Game | Given an array of non-negative integers, you are initially positioned at the first index ...
- AES 推荐文章
链接如下,写得很好!http://blog.csdn.net/a00553344/article/details/4002507
- 低配置电脑播放 flash 视频时 占 cpu 资源过高的解决方法
安装低版本的 flash player 版本, 经调试能满足播放的最低版本是 Flash Player 10.3.183.90 然后 firefox 3.6.28 + Adblock Plus 2.0 ...
- 【动态规划】skiing_深度搜索_动态规划
问题 B: [动态规划]skiing 时间限制: 1 Sec 内存限制: 128 MB提交: 28 解决: 11[提交][状态][讨论版] 题目描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪 ...
- Greedy:Radar Installation(POJ 1328)
装雷达 题目大意,就是令在海岸线的(直线)一边是海(y>0),另一边是陆地(y<=0),在海岸线上装雷达,雷达可以覆盖的范围为d,海上有岛,(x,y),问你应该怎么装雷达,才能做到技能雷达 ...
- mybatis的jdbcType类型
在用mybatis的时候,如果传过来的参数有可能为空,那么就要指定jdbcType是什么了,否则会有异常,jdbcType有以下几种: BIT FLOAT CHAR ...
- 项目总结(二)--- CocoaPods的简单介绍与使用
先谈下,我们为什么要使用CocoaPods,它能为我们做什么吧. 所有开发过iOS应用的小伙伴们都知道,在整个项目中,第三方库的引用必不可少(特别感谢那些优秀第三方开源库的作者,给我们提供了多大的便捷 ...
- UVALive 7261 Xiongnu's Land (扫描线)
Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against the ...
- css3学习总结3--CSS3图像边框
border-image属性 .className{ border-image:url(/course/54d1cae088dba03f2cd1fec1/img/border.png) 20 20 2 ...