[RESOLU] problème pour censurer des mots dans un livre d'or

Eléphanteau du PHP | 40 Messages

22 août 2013, 15:09

Bonjour à tous,

j'ai fait un petit livre d'or dans mon site et je rencontre un problème pour y incérer un petit script pour tenter de supprimer certains mots comme des insultes par exemple :
j'ai donc trois fichiers pour mon livre d'or, un fichier .txt qui stock les messages et un formulaire.

Code : Tout sélectionner

<?php //Ouverture du fichier en écriture $fp = fopen("/htdocs/livredor/guestbook.txt",a); //On convertit les caracteres html echo htmlspecialchars_decode(htmlentities($chaine, ENT_NOQUOTES, 'ISO-8859-1')); $nom = stripslashes ($_POST['nom']); $mail = stripslashes ($_POST['mail']); $message = stripslashes ($_POST['message']); $mots_a_censurer = array(' con ',' merde ', ' etc... '); $message = str_replace($mots_a_censurer, ' *** ', $message); $d = date ( "d/m/Y H:i:s" ); $page = ""; $lemail = $mail; $page .= "&nbsp;<b>$nom</b> &nbsp; ($lemail) &nbsp;le:&nbsp; $d<br>&nbsp;$message<br><hr>\n"; //On rajoute le message fwrite($fp,"$page" ,strlen("$page")); //fermeture du fichier fclose($fp); ?>
j'ai donc rajouté le code pour repérer et remplacer, mais cela ne fonctionne pas !!!

Code : Tout sélectionner

$mots_a_censurer = array(' con ',' merde ', ' etc... '); $message = str_replace($mots_a_censurer, ' *** ', $message);
pourriez vous m'aider ?
je vous en remercie par avance
scoubi

cod57
Invité n'ayant pas de compte PHPfrance

22 août 2013, 16:15

bonjour tu as des erreurs comme dans le open ... avec le mode a(ppend) pas de guillemets
<?php
//Ouverture du fichier en écriture
$nom='';
$mail='';
$message='';
$chaine='';
$fp = fopen("guestbook.txt","a+");
//On convertit les caracteres html
echo htmlspecialchars_decode(htmlentities($chaine, ENT_NOQUOTES, 'ISO-8859-1'));
if(isset($_POST) && !empty($_POST) ){
$nom = stripslashes ($_POST['nom']);
$mail = stripslashes ($_POST['mail']);
$message = stripslashes ($_POST['message']);
$mots_a_censurer = array('con','merde'); 
$message = str_replace($mots_a_censurer, '***', $message); 
}
/*test*/
$mots_a_censurer = array('con','merde'); 
$testmessage="grosse toto merde con tu es";
$test = str_replace($mots_a_censurer,'***',$testmessage); 
$d=date( "d/m/Y H:i:s" );
$page=$test."\r\n";


//On rajoute le message
fwrite($fp,$page,strlen($page));
//fermeture du fichier
fclose($fp);
?>
bon faut mettre à ta sauce ++

Eléphanteau du PHP | 40 Messages

22 août 2013, 17:44

merci je vais tester

Eléphanteau du PHP | 40 Messages

22 août 2013, 18:09

je te remercie j'ai réussi à l'adapter à mon script mais il y a t'il aussi possibilité d'interdire des expressions composées de plusieurs mots ?

cod57
Invité n'ayant pas de compte PHPfrance

22 août 2013, 18:41

une fonction

<?php
function censorWords($text){
$find = array(
'/damn\s/i',
'/shit\s/i',
'/fuck\s/i',
'/ass\s/i',
'/asshole\s/i'
);
$replace = array(
'dang',
'shoot',
'frick',
'butt',
'butthole'
);
return preg_replace($find,$replace,$text);
}
$text = 'That asshole is an assass!';
echo censorWords($text);
?>

tu peux remplacer les mots par une phrase
$find = array(
'/sale porc\s/i',
'/grosse truie qui pue\s/i',
'/shit\s/i',
'/fuck\s/i',
'/ass\s/i',
'/asshole\s/i'
);
/* ... */
et replace par $replace = '***';

une regex et preg_replace

Eléphanteau du PHP | 40 Messages

22 août 2013, 19:12

merci pour cette réponse,

mais je ne comprend pas la fin du message
et replace par $replace = '***';

une regex et preg_replace
je dois modifier comme ceci:

Code : Tout sélectionner

<?php function censorWords($text){ $find = array( '/sale porc\s/i', '/grosse truie qui pue\s/i', '/shit\s/i', '/fuck\s/i', '/ass\s/i', '/asshole\s/i' ); $replace = array( 'dang', 'shoot', 'frick', 'butt', 'butthole' ); return preg_replace($find,$replace= '$text; } ?>
à la place de :

Code : Tout sélectionner

$mots_a_censurer = array('xxxx','xxxx','xxx','xxxx'); $message = str_replace($mots_a_censurer, '***', $message);
j'ai essayé mais ne n'arrive pas à l'adapter à mon code et ou le placer !!!

Eléphanteau du PHP | 40 Messages

22 août 2013, 21:22

j'ai donc essayé de le transformer ainsi :

Code : Tout sélectionner

<?php function censorWords($message){ $find = array( '/sale porc\s/i', '/grosse truie qui pue\s/i', '/shit\s/i', '/fuck\s/i', '/ass\s/i', '/asshole\s/i' ); $replace = array( '****', '****', '****', '****', '****', '****', ); return preg_replace($find,$replace= $message; } ?>
mais sans succés

cod57
Invité n'ayant pas de compte PHPfrance

22 août 2013, 21:28

oui ça devrait fonctionner ainsi

cod57
Invité n'ayant pas de compte PHPfrance

22 août 2013, 21:35

exemple
<?php
function censorWords($text=null){
$find = array( '/sale porc\s/i',
   '/grosse truie qui pue\s/i',
   '/shit\s/i',
   '/fuck\s/i',
   '/ass\s/i',
   '/asshole\s/i'
   );
$replace = '*vilain mot*';
return preg_replace($find,$replace,$text);
}


$message_a_filtrer ='voila le message qui doit etre filtre
il contient shit et aussi fuck et grosse truie qui pue ...';

echo $resultat = censorWords($message_a_filtrer);


?>


Eléphanteau du PHP | 40 Messages

22 août 2013, 22:40

merci pour ton aide mais je n'arrive pas à le faire fonctionner !!!
voici mon code :

Code : Tout sélectionner

<?php function censorWords($text=null){ $find = array( '/sale porc\s/i', '/grosse truie qui pue\s/i', '/shit\s/i', '/fuck\s/i', '/ass\s/i', '/asshole\s/i' ); $replace = '*vilain mot*'; return preg_replace($find,$replace,$text); } $message_a_filtrer ='voila le message qui doit etre filtre il contient shit et aussi fuck et grosse truie qui pue ...'; echo $resultat = censorWords($message_a_filtrer); ?> <?php //Ouverture du fichier en écriture $chaine=''; $fp = fopen("/htdocs/livredor/guestbook.txt",a); //On convertit les caracteres html echo htmlspecialchars_decode(htmlentities($chaine, ENT_NOQUOTES, 'ISO-8859-1')); $nom = stripslashes ($_POST['nom']); $mail = stripslashes ($_POST['mail']); $message = stripslashes ($_POST['message']); $d = date ( "d/m/Y H:i:s" ); $page = ""; $lemail = $mail; $page .= "&nbsp;<b>$nom</b> &nbsp; ($lemail) &nbsp;le:&nbsp; $d<br>&nbsp;$message<br><hr>\n"; //On rajoute le message fwrite($fp,"$page" ,strlen("$page")); //fermeture du fichier fclose($fp); ?>
peux tu me dire pourquoi ?
merci par avance

Eléphanteau du PHP | 40 Messages

22 août 2013, 22:46

j'ai avancé en modifiant ainsi

Code : Tout sélectionner

<?php //Ouverture du fichier en écriture $fp = fopen("/htdocs/livredor/guestbook.txt",a); //On convertit les caracteres html echo htmlspecialchars_decode(htmlentities($chaine, ENT_NOQUOTES, 'ISO-8859-1')); $nom = stripslashes ($_POST['nom']); $mail = stripslashes ($_POST['mail']); $message = stripslashes ($_POST['message']); function censorWords($text=null){ $find = array( '/sale porc\s/i', '/grosse truie qui pue\s/i', '/shit\s/i', '/fuck\s/i', '/ass\s/i', '/asshole\s/i' ); $replace = '*vilain mot*'; return preg_replace($find,$replace,$text); } $message_a_filtrer ='voila le message qui doit etre filtre il contient shit et aussi fuck et grosse truie qui pue ...'; echo $resultat = censorWords($message_a_filtrer); $d = date ( "d/m/Y H:i:s" ); $page = ""; $lemail = $mail; $page .= "&nbsp;<b>$nom</b> &nbsp; ($lemail) &nbsp;le:&nbsp; $d<br>&nbsp;$message<br><hr>\n"; //On rajoute le message fwrite($fp,"$page" ,strlen("$page")); //fermeture du fichier fclose($fp); ?>
mais aulieu de mettre **** à la place j'ai une phrase en haut de mon livre d'or :voila le message qui doit être filtre il contient *vilain mot*et aussi *vilain mot*et *vilain mot*... cela vient sans aucun doute
de :

Code : Tout sélectionner

$message_a_filtrer ='voila le message qui doit etre filtre il contient shit et aussi fuck et grosse truie qui pue ...'; echo $resultat = censorWords($message_a_filtrer);
comment coriger dans $message ?

Eléphanteau du PHP | 40 Messages

22 août 2013, 22:53

j'ai modifié comme ceci

Code : Tout sélectionner

function censorWords($text=null){ $find = array( '/sale porc\s/i', '/grosse truie qui pue\s/i', '/shit\s/i', '/fuck\s/i', '/ass\s/i', '/asshole\s/i' ); $replace = '*****'; return preg_replace($find,$replace,$message); } $message ='****'; echo $resultat = censorWords($message);
mais du coup il n'affiche comme message **** et n'affiche pas le reste à cause de $message ='****'; !!! snif je tourne en rond tel un poisson rouge dans un bocal !!!

cod57
Invité n'ayant pas de compte PHPfrance

23 août 2013, 00:11

un gustbook basic ++
<?php
$mail='';
$nom='';
$message='';
$file = 'guestbook.txt';
/*creation du fichier si inexistant*/
if(!file_exists($file)){
$h=fopen($file,'a+');
fclose($h);
}



/*si les variables sont envoyes de puis le form*/
if(isset($_POST['sbtbtn']) &&  $_POST['sbtbtn']==='envoyer'){

$mail=htmlspecialchars(strip_tags(trim($_POST['mail'])));
$nom=htmlspecialchars(strip_tags(trim($_POST['nom'])));
$message=htmlspecialchars(strip_tags(trim($_POST['message'])));

function censorWords($find=array(),$text=null){
$replace = ' * ';
return preg_replace($find,$replace,$text);
}

/*liste des mots a filtrer ou expression aussi longue que tu veux*/
$find = array(
'/sale porc\s/i',
'/grosse truie qui pue\s/i',
'/shit\s/i',
'/fuck\s/i',
'/ass\s/i',
'/asshole\s/i'
);

$newmail = censorWords($find,$mail);
$newnom = censorWords($find,$nom);
$newmessage = censorWords($find,$message);

	if(empty($newmail) || empty($newnom) || empty($newnom) ){
	echo 'des champs sont vides<br>';
	}else{
    /*sinon ok on prepare le message*/ 

	$newdata  = '<hr>';
	$newdata .= 'Posté par <b>'.$newnom.'</b> le '.date('d m Y H:i:s').'<br>';
	$newdata .= '<a href="mailto:'.$newmail.'">'.$newmail.'</a><br>';
	$newdata .= 'Message:<br>'.$newmessage;
	$newdata .= '<hr>';
    
	/*on ouvre le fichier*/
	$data = file_get_contents($file);
	$newdata = $data.$newdata."\r\n";/*on concatene*/
	/*on rajoute le message au messages deja dans le fichier*/
	/*on ajoute la ligne*/
	$data = file_put_contents($file,$newdata);
	}

}


?>
<form method="post" action="">
<br>Nom:
<br><input type="text" name="nom">
<br>Mail:
<br><input type="text" name="mail">
<br>Message:
<br><textarea name="message" cols="51" rows="5"></textarea>
<br><input type="submit" name="sbtbtn" value="envoyer">
</form>
<?php
include($file);
?>

Invité
Invité n'ayant pas de compte PHPfrance

23 août 2013, 00:17

$newdata = $data.$newdata."\r\n";/*on concatene*/

ou du plus recent au plus vieux

$newdata = $newdata.$data."\r\n";/*on concatene*/

+++

Eléphanteau du PHP | 40 Messages

23 août 2013, 07:07

Un grand merci pour ta réponse, mais j'aimerais comprendre mon erreur.
Pourrais tu me corriger mon script et m'expliquer la ou j'ai faux car je pense que c'est ainsi que l'on progresse.
Je te remercie par avance
Scoubi