我在ASP.Net 2.0应用程序中使用VB.Net来运行一些删除一些不必要的标记的正则表达式。我想做的其中一件事是删除其中没有任何属性的span元素:
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>
RegEx是否可以实现这一点,还是我必须实现更先进的功能?
答案 0 :(得分:2)
不幸的是,正则表达式没有这种力量。你至少需要一个上下文敏感的语言来表达这样的东西。 (对不起theoretical stuff)
我还建议改用XSLT。
答案 1 :(得分:0)
我会使用XSLT而不是正则表达式。
似乎.NET对XSLT(google:xslt vb.net)有很好的支持,但我不知道它是否会解析非XHTML。标准的xsltproc命令将带有--html标志。
答案 2 :(得分:0)
HTML敏捷包应该对此有所帮助。
答案 3 :(得分:0)
XSLT不是一个选项,因为输入可能并不总是有效的XML而且HTML Agility Pack on Codeplex看起来很甜,但在这种情况下真的有点过分。这是我最终使用的最终RegEx:
<span\s*>(?<Text>.*?(?:<span[^>]*>.*?</span>.*?)*)</span>
在我测试的所有情况下,用${Text}
替换它有效地删除了无用的外span
标记。