Php 如何检测QWERTY键盘上的一个字符是否接近另一个字符?
我正在开发一个垃圾邮件检测系统,发现它无法检测这样的字符串——“asdfsdf” 我的解决方案是检测之前的键是否靠近键盘上的其他键。我不是从键盘获取输入(检测垃圾邮件),而是以字符串的形式获取 我只想知道一个角色是一个键,两个键还是两个以上键远离另一个角色Php 如何检测QWERTY键盘上的一个字符是否接近另一个字符?,php,string,keyboard,spam-prevention,qwerty,Php,String,Keyboard,Spam Prevention,Qwerty,我正在开发一个垃圾邮件检测系统,发现它无法检测这样的字符串——“asdfsdf” 我的解决方案是检测之前的键是否靠近键盘上的其他键。我不是从键盘获取输入(检测垃圾邮件),而是以字符串的形式获取 我只想知道一个角色是一个键,两个键还是两个以上键远离另一个角色 例如,在现代QWERTY键盘上,“q”和“w”两个字符相距1键。字符“q”和“s”也是如此。人类可以从逻辑上理解这一点,我如何在代码中做到这一点?在理想化的键盘上构建一个从按键到位置的地图。比如: 'q' => {0,0}, 'w' =
例如,在现代QWERTY键盘上,“q”和“w”两个字符相距1键。字符“q”和“s”也是如此。人类可以从逻辑上理解这一点,我如何在代码中做到这一点?在理想化的键盘上构建一个从按键到位置的地图。比如:
'q' => {0,0},
'w' => {0,1},
'a' => {1,0},
's' => {1,1}, ...
然后,您可以将“距离”作为两点之间的数学距离。您只需为标准qwerty键盘创建二维地图即可。 基本上它可以看起来像这样:
map[0][0] = 'q';
map[0][1] = 'a';
map[1][0] = 'w';
map[1][1] = 's';
等等
当您得到两个字符时,只需在上面的数组“map”中找到它们的x和y,并且可以简单地使用毕达哥拉斯计算距离。它无法满足你的要求,因为距离“q”和“s”只有一段距离。但它应该是sqrt(1^2+1^2)约1.4
公式是:
- 字符为c1和c2
- 求c1和c2的坐标:(x1,y1)和(x2,y2)
- 使用毕达哥拉斯计算距离:dist=sqrt((x2-x1)^2+(y2-y1)^2)
- 如有必要,将结果记录在天花板或地板上
sqrt((1-0)^2 + (0-0)^2) = sqrt(1) = 1
其基本思想是创建字符及其在键盘上位置的地图。然后可以使用简单的距离公式来确定它们之间的距离
例如,考虑键盘的左侧:
1 2 3 4 5 6
q w e r t
a s d f g
z x c v b
字符a
具有位置[2,0]
,字符b
具有位置[3,4]
。它们之间的距离公式为:
sqrt((x2-x1)^2 + (y2-y1)^2);
因此a
和b
之间的距离是sqrt((4-0)^2+(3-2)^2)
将关键点映射到矩形网格需要花费一点精力(我的示例并不完美,但它给出了一个想法)。但是在那之后,你可以建立一个地图(或字典),并且查找简单而快速。好吧,让我们看看。这很难。我总是采用蛮力方法,我远离像毕达哥拉斯试图强加给我们的那个家伙这样的先进概念,那么二维表格呢?像这样的。也许:
+---+---+---+---+---+---+---
| | a | b | c | d | f | s ...
+---+---+---+---+---+---+---
| a | 0 | 5 | 4 | 2 | 4 | 1 ...
| b | 5 | 0 | 3 | 3 | 2 | 4 ...
| c | 4 | 3 | 0 | 1 | 2 | 2 ...
| d | 2 | 3 | 1 | 0 | 1 | 1 ...
| f | 3 | 2 | 2 | 1 | 0 | 2 ...
| s | 1 | 4 | 2 | 1 | 2 | 0 ...
+---+---+---+---+---+---+---
这对你有用吗?你甚至可以用负数来表示一个键在另一个键的左边。另外,您可以在每个单元格中放置一个2整数结构,其中第二个int为正或负,以显示第二个字母是第一个字母的上下。快给我的专利律师打电话 你在用什么语言开发?对不起,我没有标记它,它是PHP。现在只是标记…目标用户群是什么?并不是所有的键盘都是QWERTY,例如,德国常见的键盘布局是QWERTZ。它主要是为了我自己的目的,一个小项目,我才开始1小时前,它的增长相当快。因此,在我准备好之前,我不会支持其他布局。我现在不担心对客户端键盘进行假设,但请记住,并非所有键盘都有相同的布局,因此,如果您确实因此遇到问题,您可能需要找出用户的区域设置,并在此基础上应用不同的键映射。对于每个常见的不同键盘布局,您将需要不同的映射。例如,法国垃圾邮件将来自AZERTY键盘。太棒了!这是精确的解,方程和所有的东西,我从来没有想过。很高兴能帮上忙。如果答案完全回答了你的问题,别忘了接受。有趣的解决方案,不是我想要的,而是另一种方法。我喜欢它