正确匹配结束标记与HTML中的开始标记与RegEx

问题描述:

我在一个ASP.Net 2.0应用程序中使用VB.Net运行一些正则表达式,删除一些不必要的标记。其中一个是我想要做的一件事就是删除没有在他们的任何属性的span元素:正确匹配结束标记与HTML中的开始标记与RegEx

output = Regex.Replace(output, "<span\s*>(?<Text>.*?)</span>" & styleRegex, "${Text}", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Singleline) 

因此,对于这个内容:

<span>Lorem <span class="special">ipsum</span> dolor sit amet.</span> 

我想删除外部跨度元素。不幸的是,我的正则表达式上面给了我这个结果,由于封闭跨度匹配它遇到的第一个:

Lorem <span class="special">ipsum dolor sit amet.</span> 

这可能与一个正则表达式或我将不得不实施一些更先进?

+8

由于这是(在此插入大数字)“我可以用正则表达式解析HTML”主题,所以我将其作为注释发布:正则表达式不能通过它的定义识别嵌套结构。如果您想识别语言(例如“嵌套结构”),请使用解析器。你用正则表达式看到的行为就像用正则表达式一样。 – Tomalak 2009-05-29 15:59:39

XSLT是不是因为输入的选项可能并不总是有效的XML和HTML Agility Pack on Codeplex看起来非常甜蜜,但确实是矫枉过正在这种情况下。下面是我最终使用最终正则表达式:

<span\s*>(?<Text>.*?(?:<span[^>]*>.*?</span>.*?)*)</span> 

更换与${Text}有效地去除无用的外部在我测试过的所有案件span标签。

我会使用XSLT而不是正则表达式。

看来.NET对XSLT有很好的支持(google:xslt vb.net),但我不知道它是否会解析非XHTML。标准的xsltproc命令将使用--html标志。

不幸的是,正则表达式没有这种力量。你至少需要一个上下文敏感的语言来表达类似的东西。 (对不起theoretical stuff

我也建议使用XSLT代替。

HTML敏捷包应该对此有所帮助。

HTML Agility Pack on Codeplex