[PHP] Regex anti insultes

NoSpe -  
 NoSpe -
Bonjour,

Je voudrais une regex anti insulte pour un traitement de données de "tchat" en ligne.
J'ai trouvé plusieurs choses mais je ne sais pas laquelle est la bonne:

#^con$|^cul$|^bite$#i
ou
#^con|cul|bite$#i
ou
#^[con|cul|bite]$#i


Sachant que je veux remplacer tous ces gros mots par des ***** (toujours 5 astérisques)

Exemples pour plusieurs phrases:

Je veux un conseil => Je veux un conseil
Je suis un con => Je suis un *****
J'ai un cul d'enfer => J'ai un ***** d'enfer
J'ai une culasse à changer => J'ai une culasse à changer


Mon code serait donc

$grosmots = " la regex que je cherche ";
$antigrosmots = "#*****#";
$phrase = $_POST['message'];
preg_replace = ($grosmots, $antigrosmots, $phrase)


Merci d'avance pour vos réponses !
A voir également:

7 réponses

Stanislas Poisson Messages postés 775 Statut Membre 66
 
Si tu veux just remplacer les mot, le mieux seriat encore de passer par un str_replace, avec un tableau pour les mot rechercher. comme cela, pas besoin, de faire une boucle sur un preg_replace dont l'utilite sera nul et non avenue du fait que tu ne cherche que des mots. (a tester afin de voir si les espaces précédent et suivant sont important)
0
Alain_42 Messages postés 5413 Statut Membre 894
 
essayes avec:

# con | cul  | bite #i
0
NoSpe
 
Bonjour,

Merci, j'ai remplacé par str_ireplace (pour la casse insensible) mais j'ai un dernier problème.

J'ai marqué dans ma regex
" con ","con "," con"


Le problème est le suivant au travers d'exemples (l'underscore remplace l'espace):
conseil ou conseil_ => conseil
_conseil ou _conseil_ => *****seil
mécontent (avec espace devant et/ou derrière) => mécontent
bacon ou _bacon => bacon
_bacon_ ou bacon_ => ba*****


Au travers de phrases, ça donne:

conseil j'ai pour toi=> OK
j'ai un conseil pour toi=> j'ai un *****seil pour toi
je vais te donner un conseil=> je vais te donner un *****seil (ne fonctionne pas non plus lorsqu'il y a un point à la fin)
j'ai mangé du bacon=> OK
bacon j'ai mangé=>ba**** j'ai mangé
j'ai mangé du bacon et du lard=> j'ai mangé du ba***** et du lard


Merci d'avance !
0
Alain_42 Messages postés 5413 Statut Membre 894
 
je vois ce qui te pose pb c'est l'absence d'espace au début ou a la fin d'une phrase, alors essayes ça en passant par un explode et avec une boucle:

<?php
$array_insultes=array("con","cul");
function remplacement_mots($chaine,$array_insultes){
	//on explode la chaine par rapport à l'espace
	$array_chaine=explode(' ',$chaine);
	for($i=0;$i<sizeof($array_chaine);$i++){
		if(in_array(trim($array_chaine[$i]),$array_insultes)){
			$array_chaine[$i]='****'; //on peut ameliorer en mettant le même nombre d'* que de lettres ?
		}
	}
	//on reforme la chaine
	$chaine_r=implode(' ',$array_chaine);
	return $chaine_r;
}

$chaine_a_traiter="Le conseil du con  n'est pas cultivé par le cul";
echo "chaine originale: ".$chaine_a_traiter;
echo "<br />chaine traitée: ".remplacement_mots($chaine_a_traiter,$array_insultes);

?>
0
Alain_42 Messages postés 5413 Statut Membre 894
 
pour forcer en minuscules:
if(in_array(trim(strtolower($array_chaine[$i]),$array_insultes))){
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NoSpe
 
Merci Alain_42 pour ta réponse mais elle me pose problème.

Voici mon code modifié:
<?php session_start();

$array_insultes=array(" ma liste de gros mots ");

function remplacement_mots($chaine,$array_insultes){
	//on explode la chaine par rapport à l'espace
	$array_chaine=explode(' ',$chaine);
	for($i=0;$i<sizeof($array_chaine);$i++)
	{
		if(in_array(trim($array_chaine[$i],$array_insultes)))
		{
	$array_chaine[$i]='****'; //on peut ameliorer en mettant le même nombre d'* que de lettres ?
		}
	}
	//on reforme la chaine
	$chaine_r=implode(' ',$array_chaine);
	return $chaine_r;
}

$message = strip_tags($_POST['message']);

echo "Votre message: ".$message;
$messagee = remplacement_mots($message,$array_insultes);

$messageee = str_ireplace($chaine," **** ",$messagee,$combien);

// Connexion à la BDD ect ...


Il me retourne ceci:

Warning: trim() expects parameter 2 to be string, array given in ***

Warning: in_array() expects at least 2 parameters, 1 given in ***


Je n'ai jamais utilisé ces fonctions et j'ai fouillé dans le manuel php mais je ne comprends pas ...
0
Alain_42 Messages postés 5413 Statut Membre 894
 
les parenthèses ne sont pas au bon endroit et laisses la fonction strtolowwer pour forcer la chaine en minuscule pour la comparaison avec les valeurs de l'array:

if(in_array(trim(strtolower($array_chaine[$i])),$array_insultes)){
0
NoSpe
 
Bonjour,

ça fonctionne nickel !
C'est vrai que je n'avais pas vu les parentheses.

Code complet pour ceux que ça interesse
<?php session_start();

$array_insultes=array("toutes les insultes en veux-tu en voilà");

function remplacement_mots($chaine,$array_insultes){
	$array_chaine=explode(' ',$chaine);
	for($i=0;$i<sizeof($array_chaine);$i++)
	{
		if(in_array(trim(strtolower($array_chaine[$i])),$array_insultes))
		{
	$array_chaine[$i]='****';
		}
	}
	$chaine_r = implode(' ',$array_chaine);
	return $chaine_r;
}

$message = strip_tags($_POST['message']);
$messagee = remplacement_mots($message,$array_insultes);
0