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

Telegram机器人消息中无效HTML标签自动替换的正则实现问题

解决Telegram机器人HTML消息无效标签转义问题

问题分析

你之前的正则代码未生效,核心原因有两点:

  1. 正则规则错误:r'&lt;[^a-zA-Z/!?](.*?)&gt;' 仅匹配&lt;后紧跟**非字母/!/?**的内容,而<argument>这类无效标签的<后是字母,完全不在匹配范围内,自然无法替换。
  2. 输入处理逻辑混淆:你传入的测试字符串已经是转义后的&lt;...&gt;,但实际场景中应该直接处理原始的<和>字符,再针对有效标签保留格式。

解决方案

Telegram官方允许的HTML标签包括:a、b、i、u、s、code、pre、strong、em、ins、del、span、br、p。我们可以用负向前瞻正则排除这些有效标签,仅转义其余的<和>:

import re

def fix_telegram_html(html_content):
    # 定义Telegram允许的HTML标签集合
    allowed_tags = {'a', 'b', 'i', 'u', 's', 'code', 'pre', 'strong', 'em', 'ins', 'del', 'span', 'br', 'p'}
    # 构建正则模式:匹配非允许标签的<...>结构,忽略大小写
    tag_pattern = re.compile(
        r'<(?!/?({})\b)[^>]*>'.format('|'.join(allowed_tags)),
        re.IGNORECASE
    )
    # 替换匹配到的无效标签:将<转为&lt;,>转为&gt;
    def replace_invalid(match):
        return match.group(0).replace('<', '&lt;').replace('>', '&gt;')
    
    return tag_pattern.sub(replace_invalid, html_content)

# 测试示例
raw_html = '<a href="tg://user?id=1">Bot</a> <argument1> <div>无效标签</div> <b>加粗文本</b>'
fixed_html = fix_telegram_html(raw_html)
print(fixed_html)

代码说明

  • 正则中的(?!/?({})\b)是负向前瞻断言,确保<后不是允许标签的开头(比如a或/a),才会匹配该标签。
  • re.IGNORECASE保证标签大小写不影响匹配(比如<Argument>也会被识别为无效标签)。
  • 替换函数仅修改无效标签的<和>,保留标签内部的内容不变。

测试输出

运行上述代码后,输出结果为:

<a href="tg://user?id=1">Bot</a> &lt;argument1&gt; &lt;div&gt;无效标签&lt;/div&gt; <b>加粗文本</b>

可以看到,有效标签<a>和<b>完全保留,无效的<argument1>、<div>都被正确转义,不会触发Telegram的格式报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:18