急求匹配HTML中指定内容的正则表达式

html-css020

急求匹配HTML中指定内容的正则表达式,第1张

用正则实现比较复杂,如果是.net平台的话,可以用平衡组完美实现。

<ul\s+id="list"\s+class="lsits">((((?!<ul\b|</ul>)[\s\S])*(?<open><ul\b[^>]*>))+(((?!<ul\b|</ul>)[\s\S])*(?<-open></ul>))+)*(?(open)(?!))((?!<ul\b|</ul>)[\s\S])*</ul>

解释:

<ul\s+id=""list""\s+class=""lsits""> #匹配开头的ul

((((?!<ul\b|</ul>)[\s\S])* #匹配<ul>和</ul>之间的字符

(?<open><ul\b[^>]*>))+ #匹配到<ul则进栈

(((?!<ul\b|</ul>)[\s\S])* #匹配<ul>和</ul>之间的字符

(?<-open></ul>))+ #匹配到</ul则出栈

)* #匹配可以重复N次

(?(open)(?!)) #判断如果栈不为空,<ul>和</ul>数量不匹配则匹配失败

((?!<ul\b|</ul>)[\s\S])*</ul> #匹配结尾的字符以及</ul>

这个正则式可以正确配对<ul>的,缺点是必须在C#.net VB.net等.net平台上运行。

如果不用.net,那么没有完美的方法。

但是如果你能确定<ul id="list" class="lsits">和</ul>之间有几对嵌套的<ul>

或者如果没有多重嵌套的正则的话,也可以有相应的严格正则。

我先就你上面的文本举个例子:

<ul\s+id="list"\s+class="lsits">[\s\S]*?<ul\b[^>]*>[\s\S]*?</ul>[\s\S]*?</ul>

解释:

<ul\s+id="list"\s+class="lsits">

[\s\S]*?<ul\b[^>]*>

[\s\S]*?</ul>

[\s\S]*?</ul>

因为你上面的文本里只嵌套了一个<ul>,所以我就只匹配这个ul,多了不要,问号表示懒惰匹配~

假设我们要获取下面html标签中的内容:

第一段是获取 <p></p>标签内部的数据,第二个是获取 <p><span></span></p>标签中的数据,其中span标签中有style属性值。

使用过正则表达式的同学肯定知道,上面两种情况其实都是一种情况,我们要获取的是 尖括号括起来的一对标签 中间的数据,起始标签形如<x>,结束标签形如</x>,这里的x表示的html标签。

此外,我们还需要考虑起始标签中包含style的数据,另外特殊的 <br/>标签,对实际获取数据无意义,也需要过滤掉。

通过上面的分析,我们可以如下正则表达式:

在使用正则表达式处理之前,我们先对数据进行预处理,比如style和

标签:

针对多个标签嵌套的情况进行处理,比如 <p><span style="white-space: normal">王者荣耀</span></p>,在经过预处理和正则匹配的后结果是 <span>王者荣耀 ,需要手工移除掉前面的起始标签,对应的方法如下:

测试方法如下:

output: