Java/Js下使用正则表达式匹配嵌套Html标签

通用 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>

var str = "
[br/]

无忧脚本0 && testver


alert(\"just a test!\");Hello.
12311<b>";
var reg = //g;
alert(str.match(reg).join("\n----------------------------------------------------\n"));

[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

在网上搜了好久也没找到完美的解决方案。不过,我们可以实现有限级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正则表达式四种常用的处理方式(匹配、分割、替代、获取)
  • JAVA中正则表达式匹配,替换,查找,切割的方法
  • java正则表达式匹配网页所有网址和链接文字的示例
  • Java使用正则表达式(regex)匹配中文实例代码
  • Java基于正则表达式实现查找匹配的文本功能【经典实例】
  • 学习Java正则表达式(匹配、替换、查找)
  • Java 正则表达式匹配模式(贪婪型、勉强型、占有型)
  • Java正则表达式实现在文本中匹配查找换行符的方法【经典实例】
  • Java基于正则表达式实现的替换匹配文本功能【经典实例】
  • 实例解析Java程序中正则表达式的贪婪模式匹配
  • Java使用正则表达式匹配获取链接地址的方法示例

Tags:正则表达式 Html标签

相关文章

  • 2016-12-12javascript将字符串中的多个空格替换为一个空格的正则实例
  • 2007-03-03正则表达式中对各字符集编码范围的总结
  • 2015-06-06常用的正则表达式集锦
  • 2011-08-08匹配yyyy-mm-dd日期格式的的正则表达式
  • 2016-12-12正则表达式字符类加深理解
  • 2015-04-04notepad、editplus等软件常用的文本整理正则表达式
  • 2013-08-08JS使用正则去除字符串最后的逗号
  • 2009-10-10ASP 正则函数替换分页后的参数
  • 2006-08-08密码强度检测函数(正则)
  • 2017-07-07正则表达式中最短匹配模式的用法浅析

最新评论

时间: 2010-07-29

java正则表达式四种常用的处理方式(匹配、分割、替代、获取)

java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下 package test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则表达式 * 正则表达式 的用法主要是4种方面的使用 * 匹配,分割,替换,获取. * 用一些简单的符号来代表代码的操作 * @author cyc * */ public class Rex { public static void ma

JAVA中正则表达式匹配,替换,查找,切割的方法

正则表达式的查找;主要是用到String类中的split(); String str; str.split();方法中传入按照什么规则截取,返回一个String数组 常见的截取规则: str.split("\\.")按照.来截取 str.split(" ")按照空格截取 str.split("cc+")按照c字符来截取,2个c或以上 str.split((1)\\.+)按照字符串中含有2个字符或以上的地方截取(1)表示分组为1 截取的例子; 按照

Java使用正则表达式(regex)匹配中文实例代码

只能输入中文 /** * 22.验证汉字 * 表达式 ^[\u4e00-\u9fa5]{0,}$ * 描述 只能汉字 * 匹配的例子 清清月儿 */ @Test public void a1() { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String regex = "^[\\u4e00-\\u9fa5]*$"; Matcher m = Pattern.compile(regex).matc

Java正则表达式实现在文本中匹配查找换行符的方法【经典实例】

本文实例讲述了Java正则表达式实现在文本中匹配查找换行符的方法.分享给大家供大家参考,具体如下: 默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTILINE 模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配. NLMatch.java: package nlMatch; import java.util.regex.Pattern; /**

实例解析Java程序中正则表达式的贪婪模式匹配

贪婪模式(Greedy): 数量表示符默认采用贪婪模式,除非另有表示.贪婪模式的表达式会一直匹配下去,直到无法匹配为止.如果你发现表达式匹配的结果与预期的不符,很有可能是因为--你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去. 贪婪与非贪婪,加上?为非贪婪: var s = '1023000'.match(/(\d+)(0*)/); s ["1023000", "1023000", ""] var s = '10230

学习Java正则表达式(匹配、替换、查找)

本文为大家分享了Java正则表达式的匹配.替换.查找和切割操作,有兴趣的朋友可以参考一下 import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class test { public static void main(String[] args) { getStrings(); //用正则表达式获取指定字符串内容中的指定内容 System.out.pri

Java 正则表达式匹配模式(贪婪型、勉强型、占有型)

Greediness(贪婪型):最大匹配 X?.X*.X+.X{n,} 是最大匹配.例如你要用 "<.+>" 去匹配 "a<tr>aava </tr>abb",也许你所期待的结果是想匹配 "<tr>",但是实际结果却会匹配到 "<tr>aava </tr>. 在 Greediness 的模式下,会尽量大范围的匹配,直到匹配了整个内容,这时发现匹配不能成功时,开始回退

Java基于正则表达式实现的替换匹配文本功能【经典实例】

本文实例讲述了Java基于正则表达式实现的替换匹配文本功能.分享给大家供大家参考,具体如下: package replaceDemo; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Frank * 替换匹配的文本 */ public class ReplaceDemo { public static void main(String[] args) { // 创建一个正则表达式模式

java正则表达式匹配网页所有网址和链接文字的示例

复制代码 代码如下: import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.

Java使用正则表达式匹配获取链接地址的方法示例

本文实例讲述了Java使用正则表达式匹配获取链接地址的方法.分享给大家供大家参考,具体如下: 获取页面中字符串的url地址我们都会使用正则表达式来匹配获取了,下面我来给大家总结几个匹配获取链接地址示例. 1.正则表达式中Matcher中find()方法的应用. 2.String对象中的 replaceAll(String regex,String replacement) 方法的使用.通过这个方法去除了不必要的字符串,从而得到了需要的网址和链接文字 例1.超简单的 String content

Java基于正则表达式实现查找匹配的文本功能【经典实例】

本文实例讲述了Java基于正则表达式实现查找匹配的文本功能.分享给大家供大家参考,具体如下: REMatch.java: package reMatch; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by Frank */ public class REMatch { public static void main(String[] args) { String patt = "Q[^

Java基于正则表达式实现xml文件的解析功能详解

本文实例讲述了Java基于正则表达式实现xml文件的解析功能.分享给大家供大家参考,具体如下: 这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node对象.xml文档树上的每一个节点都能看做一个Node对象,它拥有title.attribute和text三个自身变量以及一个childrenNode集合用来存放子节点,使用正则表达式完整装载. 一.编写N

java基于正则表达式实现时间日期的常用判断操作实例

本文实例讲述了java基于正则表达式实现时间日期的常用判断操作.分享给大家供大家参考,具体如下: 最近需要完成一个判断用户输入时间日期类型来进行相应操作的业务.实现这个功能自然少不了用到正则表达式,提高正则表达式的话,其实它的用法很简单,只需把这个表格记住并且会灵活运行就可以了. 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,"\n"匹配字符"n"."\\n"匹配一个换行符.序列&qu

Java基于正则表达式获取指定HTML标签指定属性值的方法

本文实例讲述了Java基于正则表达式获取指定HTML标签指定属性值的方法.分享给大家供大家参考,具体如下: 有时可能会有这样的需求,从HTML页面获取指定标签的指定属性值,可以通过第三方库解析来获取,但是这样相对比较麻烦! 如果使用正则表达式,那么就变得简单了.代码如下: package com.mmq.regex; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import

Java通过正则表达式捕获组中的文本

1.简介 Java 正则表达式如何捕获组中的文本 ?--请看下文. 2.代码 /** * 版权所有 编程十万个怎么办(www.tah1986.com) */ public class CapturingTextInAGroupInARegularExpression { public static void main(String[] argv) throws Exception { CharSequence inputStr = "abbabcd"; String patternSt

Java Tree结构数据中查找匹配节点方式

我就废话不多说了,大家还是直接看代码吧~ private boolean contains(List<TreeVo> children, String value) { for (TreeVo child : children) { if (child.getName().equals(value) || (child.getChildren().size() > 0 && contains(child.getChildren(), value))) { return t

JS基于正则表达式实现的密码强度验证功能示例

本文实例讲述了JS基于正则表达式实现的密码强度验证功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>www.jb51.net 我们</title> </head> <style type="text/cs

Java 使用正则表达式对象实现正则的获取功能

获取需要使用到正则的两个对象: 使用的是用正则对象Pattern 和匹配器Matcher. 用法: 范例: Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); 步骤: 1,先将正则表达式编译成正则对象.使用的是Pattern类一个静态的方法.compile(regex); 2,让正则对象和要操作的字符串相关联,通过matcher方法

java基于正则提取字符串中的数字功能【如提取短信中的验证码】

本文实例讲述了java基于正则提取字符串中的数字功能.分享给大家供大家参考,具体如下: 使用Java正则可以很方便的从字符串中提取符合条件的内容. 1.提取字符串中所有的手机号: private void getPhoneNum(String smsBody) { Pattern pattern = Pattern.compile("(13|14|15|18)\\d{9}"); Matcher matcher = pattern.matcher(smsBody); while (mat