Page 1 sur 1

Remplacement de caractères exact

Posté : 08 févr. 2005, 22:46
par charabia
Bonsoir,

J'ai un petit soucis que je n'arrive pas à résoudre. J'ai un petit chat et je voudrais censurer les gros mots en les remplaçant par un smiley.

J'ai trouvé ce petit code :
$bannir = "crotte|caca|merde|conne";
$blurb = "<img src=../images/smiles/censure.gif>";
$msg= preg_replace("/(^|[^a-zA-Z])($bannir)([^a-zA-Z]|$)/si",'\\1'.$blurb.'\\3',$msg);
Il remplace bien les mots correspondants mais voilà le hic, il me remplace aussi par exemple "déconne" en mettant "dé+le smiley", or je voudrais que seule le mot "conne" soit remplacé...

Avez-vous une petite idée ?

merci pour votre aide :wink:

Posté : 08 févr. 2005, 23:06
par @rthur
Salut,

Va faire un tour sur http://www.expreg.com (Nos regex / Chaines de caractères), il y a une version 2 du script de banissement de mots qui semble convenir à ce que tu cherches.

Posté : 09 févr. 2005, 10:06
par charabia
Merci beaucoup, je vais jeter un oeil et je te tiens au courant ;)

Posté : 09 févr. 2005, 10:14
par Ripat
Bonjour,

La raison de ton problème est que dans ton motif, la classe de caractères
[^a-zA-Z] comprend les accentués. Dans le mot déconne la regex prendra le é comme séparateur de mots (puisqu'il correspond à la classe négative plus haut).

Plusieurs solutions:
//  avec la classe \w (tous les alpha-num) insensible à la casse
$new_msg= preg_replace("/(^|[^\w])($bannir)([^\w]|$)/", '\\1'.$blurb.'\\3', $msg);

// plus simplement avec l'assertion \b (séparateur de mots)
$new_msg= preg_replace("/\b($bannir)\b/i", $blurb, $msg);
Attention, pour que \w et \b fonctionnent correctement il faut que ton serveur utilise le jeux de caractères français. Si ça ne marche pas, ajoutes:
setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1');
Voilà, mon premier post :wink:

Posté : 09 févr. 2005, 10:27
par charabia
Merci, j'ai un soucis de transfert en ce moment mais je vais tester tout ça dès que ça sera rétabli. :wink:

Posté : 09 févr. 2005, 12:54
par remram44
<?php

// Les mots à censurer
$bannir = "crotte|caca|merde|conne";

// Le texte de la censure
$blurb = "<img src=../images/smiles/censure.gif>";

// L'expression régulière
$reg="!(^|\s)($bannir)($|\s)!i";
// Avant et après le mot, il doit y avoir un blanc
// ou une extrémité du message

// Le remplacement
$msg=preg_replace($reg,'$1'.$blurb.'$3',$msg);

?>

Posté : 09 févr. 2005, 14:51
par Ripat
// Avant et après le mot, il doit y avoir un blanc

// ou une extrémité du message[/quote]Comme tu le dis il faut un espace (ou retour ligne ou tab, tous contenus dans la classe \s)..

Les mots interdits suivis par un signe de ponctuation ne seront donc pas détectés.

Comme séparateur de mots, je pense que l'assertion \b est la plus indiquée dans ce cas. Ou, éventuellement \W (mais lui, il consomme un caractère ce qui n'est pas le cas de \b)

Posté : 09 févr. 2005, 17:13
par charabia
hello !

j'ai testé un peu tous les codes, et celui ci (de ripat) semble marcher correctement :

Code : Tout sélectionner

$new_msg= preg_replace("/\b($bannir)\b/i", $blurb, $msg);
Par contre une autre dernière tite question et après ça devrait être tout bon, comment faire pour qu'il reconnaisse la casse et le pluriel...? Je ne m'y connais pas du tout en expression... :oops:

merciii :wink:

Posté : 09 févr. 2005, 17:25
par charabia
oups autant pour moi, la casse fonctionne et pour le pluriel j'ai rajouté :

Code : Tout sélectionner

$msg= preg_replace("/\b(".$bannir.")s?\b/i", $blurb, $msg);
Tout marche bien pour le moment.

Merci à tous :wink: