正则表达式匹配闭合HTML标签(支持嵌套)

所属分类: 网络编程 / 正则表达式 阅读数: 1243
收藏 0 赞 0 分享

任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题。关于正则引擎的原理,推荐《Mastering Regular Expression》中文名叫《精通正则表达式》。挺不错的一本书。

OK,先确定我们要解决的问题——从一段Html文本中找出特定id的标签的innerHTML。

这里面最大的难点就是,Html标签是支持嵌套的,怎么能够找到指定标签相对应的闭合标签呢?

我们可以这样想,先匹配最前面的起始标签,假设是div吧(<div),接着一旦遇到嵌套div,就“压入堆栈”,后面如果遇到div闭合标签了,就“弹出堆栈”。如果遇到闭合标签的时候,堆栈里面已经没有东西了,那么匹配结束,此结束标签为正确的闭合标签。

我之所以能够这样去思考,是因为我了解过正则的特性,我知道正则中的平衡组能够实现我刚才说的“堆栈”操作。所以,如果我们要编写复杂正则表达式,需要对正则的一些高级特性至少有所了解,这样我们思考问题才有个方向。

匹配任意闭合HTML标签的正则表达式:

<(?<HtmlTag>[\w]+)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

如果只想匹配div标签,可以使用下面的正则表达式:

<(?<HtmlTag>div)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

是的,你可以把div修改成任意你想要匹配的HTML标签

如果想同时匹配多个HTML标签,可以使用下面的正则表达式:

<(?<HtmlTag>(div|span|h1))[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

你还可以继续添加更多要匹配的标签

如果想匹配包含ID的标签,可以使用下面的正则表达式:

<(?<HtmlTag>[\w]+)[^>]*\s[iI][dD]=(?<Quote>["']?)footer(?(Quote)\k<Quote>)[^>]*?(/>|>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>)

这个正则匹配任意id为footer的HTML标签

脚本之家小编补充:

正则 \k

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b。

有,但是是跟<>配合用的,详见下面:
指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+\k<Word>\b。

更多精彩内容其他人还在看

正则表达式——匹配规则介绍

这篇文章主要介绍了正则表达式——匹配规则介绍,需要的朋友可以参考下
收藏 0 赞 0 分享

JavaScript 中的正则表达式(推荐)

正则表达式通常用于在文本中查找匹配的字符串,js正则表达式在程序开发中应用非常广泛,本文给大家介绍JavaScript 中的正则表达式(推荐),感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

Java正则表达式入门基础篇(新手必看)

这篇文章给大家介绍java正则表达式入门基础篇, 由于正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。感兴趣的朋友一起跟着小编来看看吧
收藏 0 赞 0 分享

linux正则表达式awk详解

这篇文章主要介绍了linux正则表达式awk的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

notepad++ 等用正则表达式自动添加sql引号的技巧

本篇文章给大家介绍notepad用正则表达式自动添加sql引号的技巧,,需要的朋友可以参考下
收藏 0 赞 0 分享

常见的正则表达式问题

这篇文章主要介绍了常见的正则表达式问题,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux正则表达式特性详解及BRE与ERE的异同点

本篇文章给大家介绍linux正则表达式特性及BRE与ERE的不同,Linux正则表达式(Regular Expression)主要遵从POSIX BRE或者POSIX ERE标准,对linux正则表达式感兴趣的朋友可以参考下本篇文章
收藏 0 赞 0 分享

Linux下如何使用grep命令查找带有tab(退格)的字符

本文给大家介绍linux下如何使用grep命令查找带有tab(退格)的字符,涉及到linux grep 查找带有tab的字符方面的知识,对linux grep tab感兴趣的朋友可以参考下本篇文章
收藏 0 赞 0 分享

WEB开发时常用的正则表达式(PHP和Javascript)

这篇文章主要介绍了WEB开发中最常用最实用的正则表达式及其用法,需要的朋友可以参考下
收藏 0 赞 0 分享

比较全面的C 、Java、JavaScript中的正则表达式详解

正则表达式(Regular Expression) 就是用某种模式去匹配一类字符串的公式。本篇文章给大家介绍C 、Java、JavaScript中的正则表达式,本文介绍的非常全面,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享
查看更多