Распознаватель речи RegEx l33t?

#javascript #html #regex #user-input

#javascript #HTML #регулярное выражение #пользовательский ввод

Вопрос:

Я знаю, что задавались вопросы, подобные этому, но это более конкретно.

У меня есть сайт, который принимает пользовательский ввод, но должен отфильтровывать некоторые слова. Например, давайте использовать слово example . 3 можно заменить на e и 4 на a, и я могу легко создать что-то, чтобы уловить это в каждом конкретном случае, как показано здесь, но я понятия не имею, как это сделать с базой данных слов.

У меня есть текстовый файл, который содержит список слов без слов, и я могу заставить его фильтровать их, но если кто-нибудь введет 3x4mpl3, это будет исключено.

Код для фильтра :

 async function isinapropriate(text) {
    const fileStream = fs.createReadStream(__dirname   "/disabledwords.txt");
    const rl = readline.createInterface({
      input: fileStream,
      crlfDelay: Infinity
    });
    for await (const line of rl) {
      if (
        new RegExp("(^| )"   line   "($| )", "g").test(
          text
            .split(": ")
            .slice(1)
            .join(": ")
        )
      ) {
        console.log(text);
        console.log("Word: "   line);
        return true;
      }
    }
    return false;
  }
  

Как я могу сделать так, чтобы он распознал ex4mple в качестве примера?

Кроме того, он чувствителен к регистру, поэтому, если example находится в базе данных, eXaMpLe все равно будет работать. Есть ли способ это исправить? Также одна последняя проблема (извините), e x a m p l e также работает, и я знаю, что решение включает s в себя или что-то в этом роде, но я не могу найти способ это исправить.

Редактировать

Приложение, которое я пишу, представляет собой приложение для форума / чата. Единственный пользовательский ввод — это то, что они публикуют

Комментарии:

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

Ответ №1:

Вместо того, чтобы пытаться создавать регулярные выражения для каждого слова в белом списке, сначала нормализуйте входное слово:

 function normalize(inp) {
    const leet = {
        "1": "l",
        "3": "e",
        "4": "a",
        "5": "s",
        "7": "t",
        "0": "o"
    };
    // get rid of leetspeak
    for (let num in leet) {
        inp = inp.replaceAll(num, leet[num]);
    }
    // get rid of casing
    inp = inp.toLowerCase();
    // get rid of non-alphanumeric characters
    inp = inp.replace(/W/g, "");
    return inp;
}

// all "example"
normalize("3x4mpl3");
normalize("e x a m p l e");
normalize("ExaMplE");
  

Комментарии:

1. Вы можете добавить "@": "a" в список замены. Вы не можете охватить каждый случай без nlp или чего-то подобного, поэтому вам приходится выбирать между чрезмерной или недостаточной коррекцией.

2. johnadoe.com — я хочу сказать, что эти вещи не идеальны и не надежны, но вот некоторая репутация

3. Вот один: I have an appointment at 4:55 -> I have an appointment at a:ss lol

4. @Aplet123 Простите мой, вероятно, глупый вопрос, поскольку я ужасно разбираюсь как в регулярных выражениях, так и в js, но есть ли простой способ сохранить оригинал, чтобы, если исходное сообщение считается правильным, вы могли вернуться к старому сообщению? Я думаю, переменные будут работать, но я действительно не уверен

5. Вы могли бы просто сохранить его где-нибудь в переменной.