[PHP] Regex anti insultes

Fermé
NoSpe - 4 janv. 2013 à 11:39
 NoSpe - 8 janv. 2013 à 10:25
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 423 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 22 mai 2018 66
4 janv. 2013 à 11:51
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 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 janv. 2013 à 13:42
essayes avec:

# con | cul  | bite #i
0
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 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
6 janv. 2013 à 11:52
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 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
6 janv. 2013 à 13:18
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
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 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
7 janv. 2013 à 18:49
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
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