如何检测 QWERTY 键盘上的一个字符是否靠近另一个字符?

lia*_*dee 5 php string keyboard qwerty spam-prevention

我正在开发一个垃圾邮件检测系统,并被警告发现它无法检测这样的字符串 - “asdfsdf”。

我的解决方案是检测之前的键是否靠近键盘上的其他键。我没有从键盘获取输入(以检测来自的垃圾邮件),而是以字符串的形式获取它。

我只想知道一个角色与另一个角色的距离是一个键、两个键还是两个以上键。

例如,在现代 QWERTY 键盘上,字符“q”和“w”将相距 1 个键。字符“q”和“s”也是如此。人类可以从逻辑上解决这个问题,我如何在代码中做到这一点?

Ale*_*son 6

您可以简单地为标准 qwerty 键盘创建一个二维映射。基本上它可能看起来像这样:

map[0][0] = 'q';
map[0][1] = 'a';
map[1][0] = 'w';
map[1][1] = 's';
Run Code Online (Sandbox Code Playgroud)

等等。

当你得到两个字符时,你只需要在上面的数组“map”中找到它们的x和y,并且可以使用毕达哥拉斯简单地计算距离。它不能满足您的要求,因为“q”和“s”的距离为 1。而是 sqrt (1^2 + 1^2) 大约 1.4

公式为:

  • 字符是c1c2
  • 查找c1c2的坐标:(x1,y1) 和 (x2,y2)
  • 使用毕达哥拉斯计算距离:dist = sqrt((x2-x1)^2 + (y2-y1)^2)。
  • 如有必要,可对结果进行上限或下限。

例如:

假设您得到字符c1 ='q' 和c2 ='w'。检查地图,发现“q”的坐标为 (x1,y1) = (0, 0),“w”的坐标为 (x2,y2) = (1, 0)。距离是

sqrt((1-0)^2 + (0-0)^2) = sqrt(1) = 1
Run Code Online (Sandbox Code Playgroud)

  • 乐意效劳。如果答案完全回答了您的问题,请不要忘记接受答案。 (2认同)