如何将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.
我试过的方法
- 找起始标签最后出现的位置,按偏移量确定对应标签后截断字符串;
- 反转字符串找最近的起始标签。
解决方案
用栈结构是最适合的方案,能完美处理嵌套标签的匹配问题:遇到起始标签就压栈,遇到</>就弹栈顶标签生成对应闭合标签。
实现思路
- 准备一个空栈,用来存还没闭合的起始标签类型;
- 逐个字符遍历输入字符串:
- 碰到
<B>、<I>、<U>时,把标签类型(B/I/U)压进栈,同时把原标签加到结果里; - 碰到
</>时,从栈顶取出最近的标签类型,生成对应的闭合标签替换原</>; - 普通文本直接加到结果里;
- 碰到
- 遍历完所有字符后返回结果字符串。
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
相关产品推荐
相关产品推荐

