TeleBot开发:如何删除Telegram消息中的@ID及超链接文本?
解决方案
注意:Telegram 嵌入超链接的文本无法仅通过正则匹配纯文本实现删除,这类富文本格式信息存储在消息的
entities字段中,需要先基于实体定位要删除的文本区间,再配合正则完成清洗。
完整修改后代码
bot.on("text", async function (msg){ let text = msg.text; // 第一步:处理富文本实体,删除嵌入超链接和@ID实体对应的文本 if (msg.entities && msg.entities.length > 0) { // 筛选要删除的实体:mention是@ID实体,text_link是自定义嵌入超链接 const toRemoveEntities = msg.entities.filter(entity => ['mention', 'text_link'].includes(entity.type) ); // 按偏移量从大到小排序,避免删除前面内容后偏移量错位 toRemoveEntities.sort((a, b) => b.offset - a.offset); // 逐个删除对应区间的文本 toRemoveEntities.forEach(entity => { text = text.slice(0, entity.offset) + text.slice(entity.offset + entity.length); }); } // 第二步:正则清洗剩余内容,删除明文链接和漏网的@ID text = text.replace( /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/g, "" ).replace(/@[a-zA-Z0-9_]{5,32}\b/g, "") // 新增:删除@开头的ID .replace(/\s{2,}/g, " ") // 可选:合并多余空格 .trim(); // 可选:去除首尾空格 console.log(text); }) bot.start();
改动说明
- 新增富文本实体处理逻辑:优先删除
mention类型的@ID实体、text_link类型的嵌入超链接实体对应的文本,解决自定义超链接无法用正则匹配的问题 - 新增@ID正则匹配规则:对纯文本中没有对应实体的@ID内容做二次清洗,保证所有@格式的ID都被删除
- 保留原有明文链接删除逻辑,新增可选的多余空格处理,优化清洗后文本的格式
内容的提问来源于stack exchange,提问作者calisa
相关产品推荐
相关产品推荐

