#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
lol4. @Aplet123 Простите мой, вероятно, глупый вопрос, поскольку я ужасно разбираюсь как в регулярных выражениях, так и в js, но есть ли простой способ сохранить оригинал, чтобы, если исходное сообщение считается правильным, вы могли вернуться к старому сообщению? Я думаю, переменные будут работать, но я действительно не уверен
5. Вы могли бы просто сохранить его где-нибудь в переменной.