Page 1 sur 2

Regex --> Détecter à la fois "gros con" "g

Posté : 03 mars 2009, 20:56
par Bizule
Regex --> Détecter à la fois "gros con" "gros&nbs;con" ou "gros  con"

Bonjour et désolé pour l'exemple :oops:

Dans un script, j'ai la possibilité de définir une liste d'expressions à filtrer.

Ainsi, si je définis :

Code : Tout sélectionner

$filter = "gros con"
--> "gros con" ne passe plus. :)

Mais j'aimerais aussi que si l'on écrive "gros con" (avec deux espaces entre les deux mots), cela soit aussi bloqué.

J'ajoute donc ceci :

Code : Tout sélectionner

$filter = "gros\s*con"
--> "groscon" "gros con", "gros con" (2 espaces entre les deux) ou même "gros con" (3 espaces) ne passent plus.

Le \s* indique en effet qu'il faut repérer 0 ou plusieurs espaces blancs.

Et maintenant le problème :

Lorsque deux espaces blancs se suivent, l'éditeur wysiwyg que j'utilise a la fâcheuse tendance de remplacer le deuxième espace blanc par  . Donc si la personne écrit "gros con" avec deux espaces entre les deux mots, l'éditeur wysiwig change cela en "gros  con"). De ce fait, mon expression regex ne détecte plus le gros mot car un   s'y est glissé.

J'aimerais donc connaitre le moyen d'indiquer dans mon expression qu'il faut bloquer toute chaine començant par "gros" et se terminant par "con", avec, entre les deux, soit rien du tout, soit des espaces blancs ou des  .

Voici quelques exemples de ce qu'il faudrait bloquer :

Code : Tout sélectionner

"gros con", "gros con", "gros con", "gros  con", "gros   con".
Merci de votre aide! Je ne trouve pas la solution :(

Re: Regex --> Détecter à la fois "gros con" &qu

Posté : 03 mars 2009, 21:13
par @rthur
Bonjour,

Je vais peut être dire une connerie, mais pourquoi ne pas faire un str_replace(' ', ' ', $texte) pour ensuite utiliser ton filtre qui marche:

Code : Tout sélectionner

$filter = "gros\s*con"

Posté : 03 mars 2009, 21:24
par zeus
Tu ne pouvais pas utiliser autre chose comme exemple ? :evil:

Posté : 03 mars 2009, 21:33
par Bizule
Désolé pour l'exemple, bien que je ne trouve pas ce mot si méchant, surtout dans son contexte... remplace-le par pignouf si tu veux.

J'aimerais bien connaitre la solution pour le problème que j'ai évoqué si elle existe. Le str_replace serait une solution, quoique pas si simple à mettre en place en l'occurrence, et j'ai d'autres exemples en tête où cela ne me servirait à rien.

Posté : 03 mars 2009, 21:40
par @rthur
Le str_replace serait une solution, quoique pas si simple à mettre en place en l'occurrence, et j'ai d'autres exemples en tête où cela ne me servirait à rien.
Développe...

Posté : 03 mars 2009, 21:50
par Invité
Je devrais réutiliser cette expression mais dans d'autres situations (par exemple "gros [[con"). Il me faut donc bel et bien une solution pour y parvenir comme je l'ai indiqué.

Posté : 03 mars 2009, 23:19
par Ryle
A mon avis tu te lances dans une belle usine à gaz...

En gros, tu cherches à identifier n'importe quel qualificatif (parce qu'il peut être gros, mais également grand, petit, sale, ...) suivit du mot "con" (mais j'imagine que d'autres insultes ne seraient pas plus appréciées, et malheureusement pour toi la langue française est riche en beaucoup de choses, y compris en insultes ... sans parler des versions phonétiques avec un "kon" ou un "quon" qu'il te faudrait gérer aussi tant qu'on y est), avec éventuellement n'importe quel(s) caractère(s) spécial(aux) entre les deux (&~#{[|`\^...) et tu seras tranquile ... tant que personne ne pensera à glisser des lettres ou des chiffres (tête 2 ...) parce que tu ne les auras pas prévus... et quand bien même il faudra ensuite réussir à dissocier tout ça des mot qui contiendront ces éléments sans forcément être grossier (tiens, ben dans contiendront, y a "tiendront" ... :-*)

Bref, si l'intention est louable, je suis pas forcément convaincu (argh encore un ;)) de l'intérêt ou de l'éfficacité par rapport au temps que tu pourrais passer dessus... mais ça n'engage que moi :)

Posté : 03 mars 2009, 23:29
par naholyr
Pour répondre à la question d'origine, un simple : "gros( |\s)*con" répondra à la problématique.

Posté : 04 mars 2009, 00:40
par Byzule
Merci beaucoup pour cette solution, je crois en effet que c'est ce qu'il me fallait.

J'entends bien ton commentaire Ryle, mais je suis quelqu'un de persévérant ;-) Et si je cherche à affiner mes expressions, c'est bien parce que je suis tout à fait conscient des difficultés que tu soulèves, et à juste titre.

Posté : 04 mars 2009, 10:14
par Berzemus
Et si quelqu'un parle d'un gros conducteur, il se passe quoi ?

Tu peux faire une recherche sur "reviewuation" ou "clbuttic" pour comprendre que ce type de filtrage n'est pas une bonne idée.

http://www.codinghorror.com/blog/archives/001176.html

Posté : 04 mars 2009, 13:27
par savageman
\Wgros( |\W)con\W

Ca gère pas mieux ça ?

Posté : 04 mars 2009, 14:43
par ouckileou
Ah il va être beau le référencement du forum avec ça =D>

Posté : 04 mars 2009, 17:41
par naholyr
Ah il va être beau le référencement du forum avec ça =D>
Trop tard

Posté : 04 mars 2009, 18:19
par Bizule
Et si quelqu'un parle d'un gros conducteur, il se passe quoi ?
Pour éviter ce genre de problèmes, je place des espaces blancs avant et/ou après lorsque cela est nécessaire (par exemple " con " au lieu de "con"). En revanche, je limite certaines expressions courantes (par exemple "sale(\s| )*con", "espèce(\s| )*de(\s| )*con").

Exemples extraits de ma liste d'expressions :

Code : Tout sélectionner

$filter = "/". # Ouverture //pvte : prudence car plusieurs mots commencent ou se terminent par pvte " pvte |petite(\s| )*pvte|grosse(\s| )*pvte|sale(\s| )*pvte|espèce(\s| )*de(\s| )*pvte|espece(\s| )*de(\s| )*pvte|es(\s| )*une(\s| )*pvte|es(\s| )*qu'une(\s| )*pvte|". //pvtain : a priori, aucun mot ne contient pvtain "pvtain|". //sal0pe : a priori, aucun mot ne se termine par sal0pe, mais certains commencent par sal0pe (sal0pette, ...) "sal0pe |petite(\s| )*sal0pe|grosse(\s| )*sal0pe|sale(\s| )*sal0pe|espèce(\s| )*de(\s| )*sal0pe|espece(\s| )*de(\s| )*sal0pe|es(\s| )*une(\s| )*sal0pe|es(\s| )*qu'une(\s| )*sal0pe|". //sal0ppe : a priori, aucun mot ne contient sal0ppe "sal0ppe|". //...de m3rde "(\s| )*de(\s| )*m3rde". # la dernière ligne n'a pas le | à la fin car le /i ferme le regex après "/i"; #Fermeture
Un site utile pour trouver tous les mots qui en contiennent un autre : http://www.plusdemots.com/

Bien sûr, ce n'est pas si simple à mettre en place... mais si vous avez de meilleures idées, n'hésitez pas. Il s'agit d'un site interactif pour enfants, d'où mon souhait d'intégrer ce genre de filtre.

Posté : 04 mars 2009, 20:50
par Bizule
\Wgros( |\W)con\W

Ca gère pas mieux ça ?
Mais c'est vrai ça ! :D

En fait, si j'ai bien compris, je pourrais même me contenter de :

Code : Tout sélectionner

\Wcon\W
Ceci détectera con, sauf si le mot est directement appondu à un caractère alphanumérique, avant ou après.

J'ai testé (http://www.regextester.com/) et cela semble OK. Par contre, si "con" est le premier mot (et que rien ne le précède) ou le dernier (et que rien ne lui succède), il ne semble pas détecté. Autrement dit, si la personne n'écrit que le mot "con" et rien d'autre, le filtre ne le bloque pas. Est-ce que je me trompe?