Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检测QWERTY键盘上的一个字符是否接近另一个字符?_Php_String_Keyboard_Spam Prevention_Qwerty - Fatal编程技术网

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

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' =

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

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

我只想知道一个角色是一个键,两个键还是两个以上键远离另一个角色


例如,在现代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)
  • 如有必要,将结果记录在天花板或地板上
例如:

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

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键盘。太棒了!这是精确的解,方程和所有的东西,我从来没有想过。很高兴能帮上忙。如果答案完全回答了你的问题,别忘了接受。有趣的解决方案,不是我想要的,而是另一种方法。我喜欢它