Вспомогательная функция: как отключить запрещенные слова? - PullRequest
0 голосов
/ 19 сентября 2019

Мне было поручено добавить функцию фильтрации запрещенных имен пользователей.Я создал огромный список этих имен и разделил все на две части, одна из которых содержит список точных совпадений, другая - список совпадений фраз / слов.

Точное совпадение работает как задумано (например, "admin "," adminello "- разрешено), но соответствие фразы / слова работает только в том случае, если это слово найдено в предложении, например," sh t hello ".Я должен также заставить его работать тире, "sh t-hello" и даже комбинированную строку типа "sh thsh thellosh * t".

Должен ли я также разделить список, потому чтоэто один файл 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;
  };
};

1 Ответ

0 голосов
/ 19 сентября 2019

Есть идеи, как сделать это правильно?

Вы можете использовать алгоритм Левенштейна .

Так что вы можете:

  • преобразует username в нижний регистр, изменяя цифры на буквы (например, 0=o) и удаляя дублированную строку (например: shitshit)
  • , чтобы найти расстояние имени пользователя с помощьюсписок запрещенных слов
  • если расстояние равно или слишком близко, заблокируйте его

В этом случае вы можете иметь ложноположительный результат, например: shot, который имеет расстояние от 1 доshit но вам не нужно создавать словарь "до бесконечности"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...