【问题标题】:Correctly matching an ending tag with its starting tag in HTML with a RegEx使用 RegEx 正确匹配 HTML 中的结束标签与其起始标签
【发布时间】:2009-05-29 15:30:43
【问题描述】:

我在 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>

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

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

这可以通过 RegEx 实现吗?还是我必须实现一些更高级的东西?

【问题讨论】:

  • 由于这是“我可以用正则表达式解析 HTML”主题的(在此处插入大数字)第一次迭代,因此我将其发布为评论:正则表达式不能,这很明确,识别嵌套结构。如果您想识别一种语言(例如“嵌套结构”),请务必使用解析器。您使用正则表达式看到的行为与单独使用正则表达式一样接近。
  • 我想对 Tomalak 的评论给予与仅在上周出现的次数一样多的支持。
  • 所以听起来我的问题的答案是:不,是的。之前提出的任何类似问题是否对 VB.Net/Asp.Net 2.0 的代码有答案?
  • 因为只有其中一个提到了 Vb.Net,并且没有一个有任何特定于 vb.net 的代码,所以我将其视为否。 :-)

标签: .net asp.net vb.net regex asp.net-2.0


【解决方案1】:

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

我还建议改用 XSLT。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      HTML Agility Pack on Codeplex

      【讨论】:

        【解决方案4】:

        XSLT 不是一个选项,因为输入可能并不总是有效的 XML,而且 HTML Agility Pack on Codeplex 看起来很漂亮,但在这种情况下确实有点矫枉过正。这是我最终使用的最后一个 RegEx:

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

        在我测试过的所有情况下,用${Text} 替换它有效地去除了无用的外部span 标签。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-24
          相关资源
          最近更新 更多