C# 去除 HTML 标签的三种方法及性能对比

凌晨两点半
凌晨两点半
发布时间:2026-10-13| 5人浏览过
原创

在C#开发中,清洗包含HTML格式的文本是常见需求。虽然正则表达式最为常用,但在处理复杂或大量数据时并非最佳方案。本文将深入剖析利用 For 循环结合字符数组进行HTML标签移除的方法,并通过实际测试数据对比其与普通正则及预编译正则的性能差异,帮助开发者根据场景选择最高效的实现。

使用 For 循环和字符数组移除 HTML

对于需要高精度和高性能的 HTML 清理场景,基于状态机的迭代方式(如 For 循环遍历字符)往往比正则表达式更为可靠。该方法通过布尔标志位 inside 记录当前是否处于 HTML 标签内部,仅当不在标签内时才将字符追加到结果缓冲区中。

/// <summary>
/// Remove HTML tags from string using char array.
/// </summary>
public static string StripTagsCharArray(string source)
{
    char[] array = new char[source.Length];
    int arrayIndex = 0;
    bool inside = false;

    for (int i = 0; i < source.Length; i++)
    {
        char let = source[i];
        if (let == '<')
        {
            inside = true;
            continue;
        }
        if (let == '>')
        {
            inside = false;
            continue;
        }
        if (!inside)
        {
            array[arrayIndex] = let;
            arrayIndex++;
        }
    }
    return new string(array, 0, arrayIndex);
}

此方法的核心优势在于避免了正则引擎的回溯开销,并且直接操作内存中的字符数组,减少了字符串创建的压力。

三种方法的性能实测对比

为了验证不同实现的效率,我们构建了一个包含约1000个 HTML 文档的测试集,每个文档约8000字符。同时定义了以下三种提取纯文本的逻辑进行基准测试:

  1. StripTagsRegex:每次调用新建 Regex 实例。
  2. StripTagsRegexCompiled:使用静态预编译的 RegexOptions.Compiled 对象。
  3. StripTagsCharArray:上述使用的字符数组迭代法。

以下是针对同一输入数据的耗时测试结果:

  • HtmlRemoval.StripTagsRegex: 2404 ms
  • HtmlRemoval.StripTagsRegexCompiled: 1366 ms
  • HtmlRemoval.StripTagsCharArray: 287 ms(最快)

在输出长度一致性方面,三种方法均能正确将 8085 个字符的 HTML 源码精简为 4382 个字符的纯文本。

各方法优缺点分析与选型建议

第1步:评估正则表达式的适用性

入口:常规文本清洗任务。 动作:使用 Regex.Replace(source, "<.*?>", string.Empty)。

注意:正则表达式难以完美处理嵌套结构或非法闭合的 HTML 标签。例如 <.*?> 这种简单写法在非标准 HTML 下可能会截断正常文本。此外,普通的 Regex.Replace 因每次运行都需编译模式,速度最慢。

第2步:权衡预编译正则(Compiled Regex)

入口:对代码简洁性有要求且性能容忍度稍高的场景。 动作:定义静态字段 static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);。

分析:RegexOptions.Compiled 能将正则表达式生成中间语言(IL),显著提升运行速度(如上表所示,约为普通正则的一半时间)。但缺点是启动开销大,且在 JIT 编译期间会占用更多内存。如果应用启动次数少、请求频繁,这是一个不错的折中方案。

第3步:采用字符数组迭代法

入口:高并发、大批量数据处理或对性能极致要求的后端服务。

优势:测试数据显示,字符数组法的耗时仅为 287ms,是预编译正则的约 1/5,是普通正则的约 1/8。它不涉及复杂的回溯算法,逻辑清晰且执行流线性化。

边界情况处理说明

自关闭标签的处理

该方法能正确处理 XHTML 标准的自关闭标签,例如:

  • <br /> 或 <br/>
  • <img src="" />

只要标签以 < 开始并以 > 结束,无论中间是否有属性,均会被识别并移除。空格的存在不影响判断逻辑。

HTML 注释的限制

当前的实现逻辑主要依赖尖括号匹配。对于 HTML 注释(如 <!-- comment -->),虽然也会被移除,但如果注释内部包含了特殊的非闭合字符组合,或者存在未闭合的标签结构,简单的状态机可能无法像专业解析器那样优雅地恢复状态。若业务强依赖 XML/XHTML 规范校验,建议在此基础之上增加对注释内容的特殊过滤逻辑。

总结

C# 中移除 HTML 标签有多种途径。虽然正则表达式编写便捷,但在面对大批量数据处理时,基于 For 循环和字符数组的状态机算法展现出了显著的性能优势。在实际工程中,可根据数据规模和对代码维护成本的考量,在“预编译正则”和“字符数组法”之间做出选择。

以上就是C#去除HTML标签方法的详细内容,更多关于C#性能优化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。