You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HTML空闭合标签替换为对应起始标签的闭合形式?

问题描述

我需要写一个带单个可变参数的方法,传入的字符串里混着普通文本和格式标签,要求把统一的闭合标签</>替换成对应起始标签的闭合形式——比如前面是<I>,后面的</>就换成</I>;前面是<B>就换成</B>,支持<B>、<I>、<U>三种标签,还要能处理嵌套的情况。

示例

  • 输入字符串:
Lorem <I>ipsum dolor sit amet</>, consetetur <B>sadipscing elitr</>, sed <U>diam</> nonumy eirmod tempor <B><I><U>invidunt</></></> ut labore et  <B>dolore</> magna aliquyam erat, sed diam voluptua.
  • 转换后结果:
Lorem <I>ipsum dolor sit amet</I>, consetetur <B>sadipscing elitr</B>, sed <U>diam</U> nonumy eirmod tempor <B><I><U>invidunt</U></I></B> ut labore et  <B>dolore</B> magna aliquyam erat, sed diam voluptua.

我试过的方法

  • 找起始标签最后出现的位置,按偏移量确定对应标签后截断字符串;
  • 反转字符串找最近的起始标签。
解决方案

用栈结构是最适合的方案,能完美处理嵌套标签的匹配问题:遇到起始标签就压栈,遇到</>就弹栈顶标签生成对应闭合标签。

实现思路

  1. 准备一个空栈,用来存还没闭合的起始标签类型;
  2. 逐个字符遍历输入字符串:
    • 碰到<B>、<I>、<U>时,把标签类型(B/I/U)压进栈,同时把原标签加到结果里;
    • 碰到</>时,从栈顶取出最近的标签类型,生成对应的闭合标签替换原</>;
    • 普通文本直接加到结果里;
  3. 遍历完所有字符后返回结果字符串。

Python代码示例

def format_tags(input_str):
    stack = []
    result = []
    i = 0
    str_len = len(input_str)
    while i < str_len:
        # 匹配起始标签
        if input_str[i:i+3] == '<B>':
            result.append('<B>')
            stack.append('B')
            i += 3
        elif input_str[i:i+3] == '<I>':
            result.append('<I>')
            stack.append('I')
            i += 3
        elif input_str[i:i+3] == '<U>':
            result.append('<U>')
            stack.append('U')
            i += 3
        # 匹配统一闭合标签
        elif input_str[i:i+3] == '</>':
            if stack:
                tag_type = stack.pop()
                result.append(f'</{tag_type}>')
            else:
                # 无对应起始标签时,可保留原标签或自定义处理
                result.append('</>')
            i += 3
        else:
            result.append(input_str[i])
            i += 1
    return ''.join(result)

# 测试示例输入
test_input = 'Lorem <I>ipsum dolor sit amet</>, consetetur <B>sadipscing elitr</>, sed <U>diam</> nonumy eirmod tempor <B><I><U>invidunt</></></> ut labore et  <B>dolore</> magna aliquyam erat, sed diam voluptua.'
print(format_tags(test_input))

方案优点

  • 完美支持嵌套标签的正确闭合,和示例中的嵌套场景完全适配;
  • 只遍历一次字符串,时间效率高;
  • 逻辑简单清晰,遇到无匹配起始标签的</>时还能灵活做容错处理。

内容的提问来源于stack exchange,提问作者hujxjuh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:07:40