Helper函数:如何禁用禁用词?
我受命为禁止的用户名添加过滤功能。我创建了一个包含这些名称的庞大列表,并将所有内容分为两部分,一个包含一个完全匹配的列表,另一个包含一个短语/单词匹配列表。
精确匹配可以按预期工作(例如,允许“ admin”,“ adminello”-),但是词组/单词匹配只能以某种方式在句子中找到该单词(例如, “ sh t hello”。我也应该使它成为破折号,“ sh t-hello”,甚至包括“ sh thsh thellosh * t”之类的组合字符串。
我还应该划分列表,因为atm是一个JSON文件,例如:
{
"admin": 1,
"sh*t": 2
}
助手功能(badNamesList-JSON文件)
module.exports = (options = {}) => {
return async context => {
const argumentsList = _.get(context, 'arguments', []);
const username = _.size(argumentsList) > 1 ? _.get(argumentsList[1], 'username') : null;
if (username) {
const exactMatchList = _.map(badNamesList, (name, key) => {
if (name === 1) return key;
});
const phraseMatchList = _.map(badNamesList, (name, key) => {
if (name === 2) return key;
});
if (_.includes(exactMatchList, _.toLower(username))) {
throw new errors.BadRequest({ fieldErrors: { username: 'forbiddenUsername' } });
}
if (_.some(phraseMatchList, name => _.includes(_.map(_.split(username, /-| /), _.toLower), name))) {
throw new errors.BadRequest({ fieldErrors: { username: 'forbiddenUsername' } });
}
}
return context;
};
};
回答如下:任何想法如何正确执行此操作?
您可以使用Levenshtein distance算法。
因此您可以:
- 将
username
转换为小写,将数字更改为字母(例如:0=o
)并删除重复的字符串(例如:shitshit
) - 使用隔离词列表查找用户名的距离
- 如果距离等于或太近,将其阻挡
在这种情况下,您可能会出现假阳性,例如:shot
与shit
的距离为1,但您无需创建“最大无穷大”字典]