Telegram机器人消息中无效HTML标签自动替换的正则实现问题
解决Telegram机器人HTML消息无效标签转义问题
问题分析
你之前的正则代码未生效,核心原因有两点:
- 正则规则错误:
r'<[^a-zA-Z/!?](.*?)>'仅匹配<后紧跟**非字母/!/?**的内容,而<argument>这类无效标签的<后是字母,完全不在匹配范围内,自然无法替换。 - 输入处理逻辑混淆:你传入的测试字符串已经是转义后的
<...>,但实际场景中应该直接处理原始的<和>字符,再针对有效标签保留格式。
解决方案
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 ) # 替换匹配到的无效标签:将<转为<,>转为> def replace_invalid(match): return match.group(0).replace('<', '<').replace('>', '>') 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> <argument1> <div>无效标签</div> <b>加粗文本</b>
可以看到,有效标签<a>和<b>完全保留,无效的<argument1>、<div>都被正确转义,不会触发Telegram的格式报错。
内容的提问来源于stack exchange,提问作者user14038884
相关产品推荐
相关产品推荐

