【问题标题】:RegEx matching HTML tags and extracting text正则表达式匹配 HTML 标签并提取文本
【发布时间】:2008-11-18 20:01:54
【问题描述】:

我有一串这样的测试:

<customtag>hey</customtag>

我想使用正则表达式来修改“customtag”标签之间的文本,使其看起来像这样:

<customtag>hey, this is changed!</customtag>

我知道我可以使用 MatchEvaluator 来修改文本,但我不确定要使用正确的 RegEx 语法。任何帮助将不胜感激。

【问题讨论】:

标签: c# regex


【解决方案1】:

我也不会为此使用正则表达式,但如果你必须,这个表达式应该可以工作: &lt;customtag&gt;(.+?)&lt;/customtag&gt;

【讨论】:

  • 谢谢 - 这工作得很好。通常我不会像这样使用 RegEx 来解析 HTML,但是这个 HTML 来自内部系统并且格式正确。
  • 作为对其他人的警告:它不适用于格式正确的语法 |Some text| - 管道符号之间的区域是匹配,因此第二个 将被删除,留下格式错误的 XML。
  • 是的,这就是为什么您不应该尝试使用正则表达式解析 xml。你可以限制标签之间的内容,只允许字母、数字和空格,这样会更好一些。但随后它仅限于特定域,因此如下所示: ([a-zA-Z0-9 ])+
  • 或者只是 ([^。但是是的,HTML 不是正则语言,因此在更一般的情况下,您不能使用正则表达式来匹配它。这与使用正则表达式匹配平衡括号的问题相同。
【解决方案2】:

在使用正则表达式解析和更改 HTML 之前,我会先把自己的腿咬断。

使用XSLDOM


有两个 cmets 要求我澄清一下。正则表达式替换适用于 OP 问题的特定情况,但一般来说正则表达式不是一个好的解决方案。正则表达式可以匹配regular languages,即可以被有限状态机接受的输入序列。 HTML 可以包含任意深度的嵌套标签,因此它不是常规语言。

这与问题有什么关系?对 OP 的问题使用正则表达式是可行的,但是如果 &lt;customtag&gt; 标签之间的内容包含其他标签怎么办?如果文本中出现文字 &lt; 字符怎么办? Jon Tackabury 提出这个问题已经 11 个月了,我猜在那个时候,他的问题的复杂性可能会增加。

正则表达式是很棒的工具,我一直都在使用它们。但是使用它们代替真正的解析器来处理需要解析器的输入只会在非常简单的情况下起作用。实际上,这些情况不可避免地会超出正则表达式的处理范围。发生这种情况时,您会很想编写更复杂的正则表达式,但这些很快就会变得非常费力开发和调试。当解析需求扩大时,准备废弃正则表达式解决方案。

XSL 和 DOM 是设计用于处理 XML 或 XHTML 标记的两种标准技术。这两种技术都知道如何解析结构化标记文件、跟踪嵌套标签并允许您转换标签属性或内容。

这里有几篇关于如何在 C# 中使用 XSL 的文章:

这里有几篇关于如何在 C# 中使用 DOM 的文章:

这是一个帮助对 HTML 进行 DOM 和 XSL 操作的 .NET 库:

【讨论】:

  • 嗯,我偶尔会在受控环境中使用它们,使用已知一致的机器生成代码,以便快速完成工作......
  • 那您为什么不向我们展示如何在 C# 中使用 XSL 或 DOM 来实现呢?做出笼统的陈述很容易。让我们看看实际的代码。正则表达式不适合解析一般的 HTML,但它们非常适合用特定的 HTML 代码做特定的事情。
  • 我承认你让我发笑,但是让我们来解释一下,或者提供一个链接来解释你为什么宁愿咬掉你的腿。我想这对于一些程序员来说真的很明显,但对于新手来说可能不是?
【解决方案3】:

如果两个标签之间没有任何其他标签,这个正则表达式更安全,更高效:

<customtag>[^<>]*</customtag>

【讨论】:

    【解决方案4】:

    大多数人使用 HTML Agility Pack 进行 HTML 文本解析。但是,对于我自己的需求,我发现它有点健壮和复杂。我在内存中创建了一个 Web 浏览器控件,加载页面并从中复制文本。 (见下面的例子)

    你可以在这里找到 3 个简单的例子:

    http://jakemdrew.wordpress.com/2012/02/03/getting-only-the-text-displayed-on-a-webpage-using-c/

    【讨论】:

      【解决方案5】:
      //This is to replace all HTML Text
      
      var re = new RegExp("<[^>]*>", "g");
      
      var x2 = Content.replace(re,"");
      
      //This is to replace all &nbsp;
      
      var x3 = x2.replace(/\u00a0/g,'');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 2018-10-11
        • 2018-05-08
        • 1970-01-01
        相关资源
        最近更新 更多