Regex --> Détecter à la fois "gros con" "gros&nbs;con" ou "gros  con"

Bizule
Invité n'ayant pas de compte PHPfrance

03 mars 2009, 20:56

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 :(

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 mars 2009, 21:13

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"
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 mars 2009, 21:24

Tu ne pouvais pas utiliser autre chose comme exemple ? :evil:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Bizule
Invité n'ayant pas de compte PHPfrance

03 mars 2009, 21:33

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 mars 2009, 21:40

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...
Quand tout le reste a échoué, lisez le mode d'emploi...

Invité
Invité n'ayant pas de compte PHPfrance

03 mars 2009, 21:50

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é.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 mars 2009, 23:19

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

03 mars 2009, 23:29

Pour répondre à la question d'origine, un simple : "gros( |\s)*con" répondra à la problématique.

Byzule
Invité n'ayant pas de compte PHPfrance

04 mars 2009, 00:40

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.

ViPHP
ViPHP | 4039 Messages

04 mars 2009, 10:14

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
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 185 Messages

04 mars 2009, 13:27

\Wgros( |\W)con\W

Ca gère pas mieux ça ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 mars 2009, 14:43

Ah il va être beau le référencement du forum avec ça =D>

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

04 mars 2009, 17:41

Ah il va être beau le référencement du forum avec ça =D>
Trop tard

Bizule
Invité n'ayant pas de compte PHPfrance

04 mars 2009, 18:19

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.

Bizule
Invité n'ayant pas de compte PHPfrance

04 mars 2009, 20:50

\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?