如何封禁由emoji组成的字符串?现有代码失效求助
解决区域指示符emoji绕过封禁的问题
看起来你遇到的核心问题是精确匹配的局限性——你原来的代码只会在消息内容和那串emoji组合完全一致时才触发,但用户很容易通过调整空格、添加其他字符来绕过这个限制。下面给你两个实用的解决方案:
方案1:转换emoji为字母后检测(推荐)
区域指示符emoji的命名是有规律的::regional_indicator_x:对应的就是小写字母x。我们可以先把消息里的这类emoji转换成对应的字母,再检查是否包含封禁词,这样不管用户怎么排版emoji,只要拼成了目标词就能被检测到。
代码示例:
// 将消息中的区域指示符emoji转换为对应字母 const convertedContent = message.content.replace( /:regional_indicator_([a-z]):/g, (_, matchedLetter) => matchedLetter ); // 检查转换后的文本是否包含封禁词(替换成你实际要封禁的词) if (convertedContent.includes("word")) { message.delete(); // 可选:给用户发送提示,3秒后自动删除提示 message.channel.send("请勿发送违规内容!").then(msg => setTimeout(() => msg.delete(), 3000)); }
方案2:用正则模糊匹配emoji组合
如果你只想针对那串特定的emoji组合(不管前后有没有其他内容,也不管emoji之间的空格数量),可以用正则表达式来匹配:
// 正则匹配任意空格分隔的目标emoji,允许前后有其他内容 const forbiddenEmojiPattern = /:regional_indicator_n:\s*:regional_indicator_w:\s*:regional_indicator_o:\s*:regional_indicator_r:\s*:regional_indicator_d:/; if (forbiddenEmojiPattern.test(message.content)) { message.delete(); }
这里的\s*会匹配0个或多个空白字符(包括空格、换行符等),所以不管emoji之间是1个空格、多个空格甚至没有空格,都能被检测到。
小建议
- 可以把两种检测逻辑结合起来,同时覆盖普通文本和emoji版本的违规内容
- 如果你的机器人有自动审核功能,建议把这类规则加入到关键词库中,方便后续维护
内容的提问来源于stack exchange,提问作者Hedphelym
相关产品推荐
相关产品推荐

