Remplacement de caractères exact

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Remplacement de caractères exact

par charabia » 09 févr. 2005, 17:25

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:

par charabia » 09 févr. 2005, 17:13

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:

par Ripat » 09 févr. 2005, 14:51

// 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)

par remram44 » 09 févr. 2005, 12:54

<?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);

?>

par charabia » 09 févr. 2005, 10:27

Merci, j'ai un soucis de transfert en ce moment mais je vais tester tout ça dès que ça sera rétabli. :wink:

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

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:

par charabia » 09 févr. 2005, 10:06

Merci beaucoup, je vais jeter un oeil et je te tiens au courant ;)

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

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.

Remplacement de caractères exact

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

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: