博客热门评论者脚本无法识别►等特殊符号导致排除用户名失效,如何解决?
问题根因排查
- 最常见的原因是Feed接口返回的特殊符号没有被直接解析为Unicode字符,而是被转义为HTML实体(
►对应►,◄对应◄),和你在排除列表里写的原生符号不匹配,严格相等判断自然失效 - 其次可能是用户名中存在肉眼不可见的特殊字符(比如零宽空格、控制字符)、或者前后/符号旁存在多余空格,导致字符串无法完全匹配
修复方案
第一步:先确认实际获取的用户名内容
在你现有代码的var authorName = entry.author[0].name.$t;行后插入一行调试代码,打印真实返回的用户名编码:
console.log("实际用户名编码:", encodeURIComponent(authorName));
打开页面控制台触发脚本运行,找到对应带特殊符号用户名的输出,和你预期的encodeURIComponent("► JUCA ELE ◄")结果对比,即可确认是否存在字符差异。
第二步:替换原有匹配逻辑,使用归一化后的值做判断
将原有代码中if(excludeUsers.indexOf(authorName) != -1) continue;的部分替换为如下代码,自动处理转义、不可见字符、空格差异问题:
// 字符串归一化:消除转义、不可见字符、空格差异的影响 function normalizeName(name) { // 解码HTML实体为原始字符 const txt = document.createElement('textarea'); txt.innerHTML = name; let res = txt.value; // 移除零宽字符、控制类不可见字符 res = res.replace(/[\u200B-\u200D\uFEFF\x00-\x1F\x7F]/g, ''); // 统一空格格式,移除首尾多余空格 res = res.replace(/\s+/g, ' ').trim(); return res; } // 预先归一化所有排除用户名 const normalizedExcludes = excludeUsers.map(u => normalizeName(u)); // 归一化当前评论者用户名 const normalizedAuthor = normalizeName(authorName); // 匹配判断 if (normalizedExcludes.includes(normalizedAuthor)) { continue; }
备选快速方案
如果仅需排除该特定用户,可直接增加子串匹配判断,无需完全匹配特殊符号:
在原有排除判断前加一行:
if (authorName.includes("JUCA ELE")) continue;
内容的提问来源于stack exchange,提问作者Osvaldo Correia
相关产品推荐
相关产品推荐

