[PHP] Regex anti insultes
NoSpe
-
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:
Sachant que je veux remplacer tous ces gros mots par des ***** (toujours 5 astérisques)
Exemples pour plusieurs phrases:
Mon code serait donc
Merci d'avance pour vos réponses !
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 !
7 réponses
-
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)
-
-
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 ! -
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); ?> -
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 ... -
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)){ -
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);