Page 1 sur 1

Banir des mots d'un texte

Posté : 14 juin 2008, 00:07
par supercanard
Bonsoir

Je cherche à approfondir une fonction de bannissement de mots interdits.
Au départ il y avait une simple liste de mots interdits, une chaine et un preg_match()

Le problème c'est que si le mot filou est considéré comme interdit et qu'on envoi la chaine petitfilou, c'est bel et bien de la gruge. Il faut donc le considérer comme mot interdit. Mais maintenant si je prend le mot con (désolé hein...) et la chaine concombre, là ça n'a rien à voir, il ne faut pas en tenir compte.

J'ai donc exploser la chaine pour pouvoir faire un preg_match() mot par mot dans un premier temps.
Ensuite si TRUE je compare le mot suspect et le mot interdit avec le mot suspect. Si ils ont le même nombre de caractères il n'y a pas de doutes. Sinon le mot est quand même suspect mais il ya un doute... et voilà je suis bloqué ici :D
// Chaine à verifier
$chaine = 'idiot du village continu sa route<br>';
// Liste des mots interdits ( sans accents et séparé par des virgules )
$MotsInterdits = 'enfoire,con,idiot';


$MotsInterdits = explode( ',', $MotsInterdits);	
// On remplace les caractères avec accent par leur équivalent sans accent
$chaine = strtr( $chaine, 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ', 
'aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn' );

// On explode les suites de caractères séparés par des espaces
$chaine = explode( ' ', $chaine );
// On parcour le tableau des mots interdits
foreach( $MotsInterdits as $interdit )
{
	// On parcour le tableau des mots de la chaine à vérifier
	foreach( $chaine as $mot )
	{
		// On cherche le mot dans le masque
		if ( preg_match( '/'.$interdit.'/i', $mot ) )
		{
			// On compare sur le nombre de caractères
			if ( ( strlen( $interdit ) == strlen( $mot ) ) ) //
			{
				echo 'le mot '.$mot.' est à banir<br />';
			}
			else
			{
				echo 'le mot '.$mot.' est peut être à banir...<br />';
			}
		}
	}
}

Posté : 14 juin 2008, 09:14
par bourgneuf
il y a une façon simple de différencie con et concombre c'est le mètre le mot interdit égal a " con "
avec les espaces. et le mot de remplacement " *** " avec les espace.
tout çà avec la fonction str_replace
$texte = str_replace ( " con ", " *** ", $texte);
$texte = str_replace ( " filou ", " ***** ", $texte);
maintenant il n'y a aucune différence entre "espesedecondenul" et "anticonstitutionellement"
dsl c'est le seul mot que j'ai trouver avec con dedans :oops:
au niveau des caractère.

J'espère que j'ai répondu a ta question et que je me suis pas trompé :D

Posté : 14 juin 2008, 10:49
par supercanard
Salut
Bon tout dabord je te remercie pour ton idée mais je pense que tu as mal compris. Enfin j'ai peut être mal expliqué aussi ;)

Si je reprend ton exemple avec le texte : continu le chien est con

Le résultat donne : *** tinu le chien est ***

Donc c'est pas bon, puisque continu n'a rien à voir avec la choucroutte.

Si je fait la même chose avec mon exemple le résultat donne :

le mot continu est peut etre a banir...
le mot con est a banir


Voilà qui est un peu mieux mais pas parfait. puisque j'ai juste dectecté qu'il y a peut être un mot à banir... ou peut être pas.

Maintenant je cherche un moyen de pousser un peu plus loin quand il y a doute sur un mot.
J'ai peut être déjà une piste. Cette chaine serait considérée comme mot peut être à bannir : l'con
Donc je pourrais déjà détecter la présence d'apostrophe juste avant le mot suspect.
Je pourrais aussi conpter le nombre de caractères dans le mot. car si l'on écrit continulechienestcon, sans espace, on passe au travers. Et un mot aussi long, bon ça existe mais c'est rare...

Si vous avez d'autres idées...

Posté : 14 juin 2008, 11:09
par sadeq
Non, le code de bourgneuf, te répondra bien à ce que tu veux :
Pour le texte : continu le chien est con
Il te donnera : continu le chien est ***

Car son str_replace() cherche à remplacer le texte : " con " entouré par deux espaces.

Posté : 14 juin 2008, 11:29
par supercanard
humm mais chez moi avec espace ça me remplace rien... et si je les enlèves ça donne ce que je disais.
Mais la n'est pas le problème en fait. Le problème est plutôt, comment détecter que ceci doit être banni ? :

le chien estcon !

Bon en fait c'est peut être presque impossible je me rend compte...

Posté : 14 juin 2008, 11:36
par sadeq
Le problème n'est pas de pouvoir detecter les occurences "con" quelque soit le format du contexte mais c'est de créer un raisonnement pour analyser et suspecter les mots trouvés.
Le mieux est de construire un Dico de mots suspects qui s'enrichit au fur et à mesure des travaux de modération et qui augmente la capacité du raisonnement automatisé.

Posté : 14 juin 2008, 13:31
par bourgneuf
oui je pense que c'est la meilleur idée car sinon tu est obligé de modifier de code source a chaque fois.
Je ne pense pas que l'on puisse donner un raisonnement qui exclu les mot banni.
Mais tu peut faire un fichier txt avec les mot dedans :
mot1
mot2
mot3
et apres tu fait un code qui conpara rapidement tout les mot pour savoir si c'est dans ton fichier ou pas.
De plus, tu peut faire un fichier php avec un formulaire qui rajoute un mot exclu

Je ne vais pas de donner le code source car je crois que c'est pas la pédagogie du forum. Mais avec une boucle ...
bonne chance :D

Posté : 15 juin 2008, 14:16
par Berzemus
Les espaces, ça ne marche que pour les mots entourés d'espaces. Exit la ponctuation, les mots en début et en fin de texte...

Et comme d'habitude, un seul sauveur, les expressions régulières !! :D