php - 如何检测一个字符是否与 QWERTY 键盘上的另一个字符接近?

标签 php string keyboard spam-prevention qwerty

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

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

我只想知道一个字符是一个键、两个键还是两个键以上的另一个字符。

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

最佳答案

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

map[0][0] = 'q';
map[0][1] = 'a';
map[1][0] = 'w';
map[1][1] = 's';

等等。

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

公式是:
  • 字符是 c1​​ 和 c2
  • 查找 c1 和 c2 的坐标:(x1,y1) 和 (x2,y2)
  • 使用毕达哥拉斯计算距离:dist = sqrt((x2-x1)^2 + (y2-y1)^2)。
  • 如有必要,对结果进行 ceil 或 floor。

  • 例如:

    假设您得到字符 c1='q' 和 c2='w'。检查 map 并发现'q' 的坐标为(x1,y1) = (0, 0),'w' 的坐标为(x2,y2) = (1, 0)。距离是
    sqrt((1-0)^2 + (0-0)^2) = sqrt(1) = 1
    

    关于php - 如何检测一个字符是否与 QWERTY 键盘上的另一个字符接近?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7621043/

    相关文章:

    php - 如何删除 facebook.com 的所有 cookie?

    php - 这段代码有什么作用?

    c++ - 取而代之的是获取存储的内存编号

    iphone - 在所有内容(甚至键盘)之上显示 uiview

    java - Android中键盘和EditText之间的空间

    php - 如何在 Laravel 查询构建器|Laravel 中访问 orWhere() 内部的变量

    javascript - 使用 PHP 和 JS 将 div = contenteditable 保存到 MySQL

    javascript - 使用 javascript 将所有出现的字符串替换为字符

    java - 搜索数组中的单词

    android - 启动应用程序时关闭软键盘