phpstringkeyboardspam-preventionqwerty

How could I detect if a character close to another character on a QWERTY keyboard?


I'm developing a spam detection system and have been alerted to find that it can't detect strings like this - "asdfsdf".

My solution to this involves detecting if the previous keys were near the other keys on the keyboard. I am not getting the input (to detect spam from) from the keyboard, I'm getting it in the form of a string.

All I want to know is whether a character is one key, two keys or more than two keys away from another character.

For example, on a modern QWERTY keyboard, the characters 'q' and 'w' would be 1 key away. Same would the chars 'q' and 's'. Humans can figure this out logically, how could I do this in code?


Solution

  • You could simply create a two-dimensional map for the standard qwerty keyboard. Basically it could look something like this:

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

    and so on.

    When you get two characters, you simply need to find their x, and y in the array 'map' above, and can simply calculate the distance using pythagoras. It would not fill the requirement you had as 'q' and 's' being 1 distance away. But rather it would be sqrt(1^2 + 1^2) approx 1.4

    The formula would be:

    For example:

    Say you get the characters c1='q', and c2='w'. Examine the map and find that 'q' has coordinates (x1,y1) = (0, 0) and 'w' has coordinates (x2,y2) = (1, 0). The distance is

    sqrt((1-0)^2 + (0-0)^2) = sqrt(1) = 1