我知道有人问过类似的问题,但这更具体。
我有一个接受用户输入的网站,但需要过滤掉一些单词。例如,让我们使用单词example。3可以代替e,4可以代替a,我可以很容易地根据具体情况构建一些东西来捕捉这一点。
我有一个txt文件,其中包含一个没有单词的列表,可以用它来过滤它们,但如果有人键入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仍然可以工作。有没有办法修复?还有最后一个问题(对不起(,e x a m p l e也有效,我知道解决方案涉及s
或其他什么,但我无法找到解决它的方法。
编辑
我正在编写的应用程序是一个论坛/聊天室应用程序。唯一的用户输入是他们发布的
不要试图为白名单中的每个单词创建正则表达式,而是首先规范化输入单词:
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");