Moulinette de test pour éviter les messages poubelles

Description

Salut a tous,
voila en ayant marre de voir les gros boulets du net remplir les bases de données avec des messages inutiles j'ai développé ce script qui peut aussi etre nécessaire lorsqu'on attend une réponse autre que "qlksdj qlmksdjqsdmlj" lors de la création d'un accompte par exemple.

Lorsque j'aurai un peu de temps je m'efforcerais de le compléter et de l'optimiser
Pour l'instant il détectes les phrases avec de multiples repetitions de charactères comme par exemple
"looooooooooooooooooool" ou autre trucs qui ne servent a rien

Et il détecte aussi les phrases tel que
"qslmkj qlsjflmqskjdf lmkqsdjf"

Je n'utilise pas de dictionnaire, afin de rendre ce script exportable dans nimporte quelle langue.

Le principe de base étant de détecter la position des touches frappées les unes par rapport aux autres et d'en déduire si le mec a tapé comme un bourrin ou pas...
Le code est assez succin pour le moment mais j'essaierai, comme dit plus haut, de le compléter, et notamment d'y ajouter un algo un peu plus performant avec une matrice, afin de rendre le tout un peu plus évolué :)

Je l'ai testé avec un bon nombre de phrases il ne m'a pas paru défaillant et bien sur tout est paramétrable !

si ca peux servir a quelqu'un ;)

Source / Exemple :


<?php
if ($_GET['debug'] == 1)
{
	if (moulinette_test($_GET['word']))
		echo "<font color=green>valid sentence</font>";
	else
		echo "<font color=red>Unvalid sentence</font>";
}

function moulinette_test($word)
{
	return (moulette1($word) && moulette2($word) && dico($word));
}

function dico($word)
{
	$grace = 1;

	/*

    • Edit the forbidden words here
  • /
$f = array(); $f[0] = "zobi"; $f[1] = "caca"; $len_forbidden_words = count($f); for ($i = 0; $i < $len_forbidden_words /*&& $grace*/; $i++) //remove /* and */ to get optimization if (ereg($f[$i], $word)) $grace--; if ($_GET['debug'] == 1) { echo "dico for ".$word."<br>"; if ($grace <= 0) echo "Found ".(($grace * (-1)) + 1)." forbidden words"; echo "<br><br>"; } if ($grace > 0) return (1); else return (0); } function set_keyboard() { /*
    • Azerty configuration
  • /
$keyboard = array(); /*
    • Azerty Lower case
  • /
$keyboard[0] = "azertyuiop^$"; // first line $keyboard[1] = "qsdfghjklmù*"; // second line $keyboard[2] = "<wxcvbn,;:!"; // third line /*
    • Azerty upper case
  • /
$keyboard[3] = "AZERTYUIOP"; // first line $keyboard[4] = "QSDFGHJKLM%µ"; // second line $keyboard[5] = "<WXCVBN,;:!"; // third line return ($keyboard); } function moulette2($word) { /*
    • If it is sentence that contains at least 3 words with multiple char repetitions
    • KILL
  • /
$len_word = strlen($word); $grace = 6; // 3 allowed repetitions THEN KILL $spaces = 3; // must contain more than 3 spaces if ($len_word > 0) { for ($i = 1; $i < $len_word; $i++) if ($word[$i - 1] == $word[$i]) $grace--; elseif ($word[$i] == "%20" || $word[$i] == " ") $spaces--; if ($_GET['debug'] == 1) { echo "moulette2 for $word<br>"; echo "condition: grace > 0 && space < 0 <br>"; echo "grace: $grace<br>"; echo "spaces: $spaces<br><br>"; } if ($grace < 0 && $spaces > 0) // multiple repetitions in a (max) $spaces + 1 words sentence return (0); return (1); } else return (0); // word has 0 length } function moulette1($word) { /*
    • if there are more than 3 neightbourgh letters it is probably a test message
  • /
$allowed_grace = 4; // Max allowed letters follow between two spaces $keyboard = array(); $keyboard = set_keyboard(); $defined_keyboards = (count($keyboard) + 1) / 3; $grace = $allowed_grace; for (; $defined_keyboards > 0; $defined_keyboards--) //for each keyboard { $word_length = strlen($word); for ($i = 0; $i < $word_length && $grace > 0; $i++) { if ($word[$i] == " " || $word[$i] == "%20") $grace = $allowed_grace; /*
    • Loop to find the position of the letter in the right keyboard
  • /
$k = ($defined_keyboards * 3) - 1; $mouchard = 3; // nb of keyboard lines while ($mouchard > 0) { $len_keyboard = strlen($keyboard[$k]); for ($j = 0; $j < $len_keyboard && $keyboard[$k][$j] != $word[$i]; $j++) ; if ($keyboard[$k][$j] == $word[$i]) $mouchard = -1; else { $mouchard--; $k--; } } /*
    • We found the letter in one of the keyboards
    • But we need to check if it isnt a "e" or e "r" beaceause they are used very often
    • and if we include them in our test we should probably get an error !
  • /
if ($mouchard == -1 && $word[$i] != "e" && $word[$i] != "r" && $word[$i] != "t") { // detection de la touche dacote directement if ($keyboard[$k][$j + 1] == $word[$i + 1] || $keyboard[$k][$j - 1] == $word[$i + 1]) $grace--; // detection de deux touches plus loin if ($keyboard[$k][$j + 1] == $word[$i + 2] || $keyboard[$k][$j - 1] == $word[$i + 2]) $grace--; } } } if ($_GET['debug'] == 1) { echo "<br>moulette 1 for: ".$word."<br>"; echo "condition is grace > 0<br>"; echo "grace is : $grace<br>"; if ($grace <= 0) echo "matched error with: ".$word[$i - 2].$word[$i - 1].$word[$i]."<br>"; echo "<br><br>"; } if ($grace > 0) return (1); else return (0); } ?>

Conclusion :


voici un lien pour le tester:
http://drrapidos.free.fr/phpcs/moulinette_anti_test.php?debug=1&word=Vive phpcs !!!
http://drrapidos.free.fr/phpcs/moulinette_anti_test.php?debug=1&word=qsdlkfj qlkjflqmksdj gmlkqsdg
http://drrapidos.free.fr/phpcs/moulinette_anti_test.php?debug=1&word=looooooooooooooooooooool
http://drrapidos.free.fr/phpcs/moulinette_anti_test.php?debug=1&word=je n'ai qu'un mot a dire: looooooooooooooooool

de maniere générale vous n'aurez qu'a modifier $grace pour rendre la moulinette plus souple.
Et on peux également rajouter un caliver le clavier qwerty, dworak ou autre claviers barbares :)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.