Page 1 sur 2

Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 11:00
par Neum
Bonjour,

Je venais juste demander ici un petit coup de pouce rapide sur la bonne syntaxe d'un regex que j'essaie de construire. Entendons-nous bien : je parviens à comprendre le regex, je sais ce que je veux, j'arrive à voir ce qu'il faut faire mais le problème est que ce n'est qu'une compréhension de principe : il me manque la précision technique exacte du regex. J'aurais donc en fait besoin d'une confirmation ou d'une infirmation.

Le but est celui-ci : interdire des gros mots dans des champs d'un formulaire. Donc je suis parti de la base "Commence par" et "Se termine par" pour interdire un gros mot qui serait inscrit dans le champ comme unique réponse. Par exemple : #^con$#i (j'ai rajouté le i pour l'insensibilité à la casse). Ainsi, de la sorte, si ce gros mot est inscrit, on renvoie au formulaire avec le message d'erreur, mais si un mot de type conseil est entré, là en revanche ça passe.

Le problème est que je voudrais créer une liste de mots à rejeter. Donc passer par le "Ou" .
J'ai bien compris que pour dresser une liste de mots on fait comme ceci : #mot1|mot2|mot3#, mais ici c'est seulement pour détecter un des mots listés dans une phrase. Or comme je viens de l'expliquer, des mots peuvent contenir des syllabes qui en elles-mêmes sont des gros mots (conseil), auquel cas cette syntaxe basique du "Ou" ne fonctionne pas dans mon cas, car un texte parfaitement correct serait défini comme invalide.
J'ai donc besoin de créer une liste de gros mots dans mon Regex avec les mentions "Commence par" et "Se termine par" POUR CHAQUE MOT, et tous, insensibles à la casse.

Ma question est donc la suivante : dois-je écrire mon Regex comme ça :

#^grosmot1$|^grosmot2$|^grosmot3$#i

ou comme ceci :

#^grosmot1|grosmot2|grosmot3$#i

Voilà... Merci beaucoup de bien vouloir me répondre.
Bien cordialement à tous,
Franck

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 11:28
par stealth35
hello,
Pas besoin d'un regexp pour ca :wink:

sinon au niveau regexp faut utilise \b qui est la limite de mot

Code : Tout sélectionner

\b(insulte|insulte2|insulte3)\b

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 11:58
par telnes
hello

str_replace() est plus rapide

++

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 12:15
par Neum
Bonjour,

et merci de me répondre. Cela étant, et je ne veux pas dire d'âneries, je ne pense pas que la solution de la délimitation du mot entier telle que définie par le code "\b" soit la réponse à ma question.

Si j'ai compris ce que j'ai lu en amont, avant de venir ici, qui fait suite en outre à mes propres tests, le simple fait que, toujours par rapport à mon exemple, la grossièreté "con" soit identifiée, même si le mot fait en fait partie d'un autre mot, tel que conseil donc, le code "\b" va bloquer le mot. Or dans le cas que j'ai exposé - un formulaire - il ne le doit pas, conseil étant un mot parfaitement valide.

Voilà pourquoi j'ai opté pour la syntaxe ^(commence par) et $ (finit par). Là, le regex fonctionne à 100%. Con est bloqué conseil est validé. Testé, vérifié. J'ai juste à présent besoin de savoir comment syntaxer le regex pour une liste. C'est tout.

Cela étant, vous refutez l'usage du regex pour ce genre de problématique. Là aussi, c'est une question de méthode j'imagine. D'autres passent par cette technique et la recommandent même. J'utilise moi-même d'autres regex dans ma page de traitement de formulaire, sans problème : c'est un outil aussi efficace que puissant. Pour tout dire, question de goût peut-être, je souhaite faire ici un régex.

Je repose donc ma question : dois-je écrire :

#^grosmot1$|^grosmot2$|^grosmot3$#i

ou comme ceci :

#^grosmot1|grosmot2|grosmot3$#i

Merci et cordialement

P.S. : je viens de voir l'autre réponse en postant cette réponse. Merci là aussi de me répondre, mais encore une fois, je n'ai pas besoin de str_replace ou preg_replace même, car il n'est pas question ici de remplacer une grossièreté par, par exemple, des étoiles de censure (****) MAIS de bloquer la page de traitement du formulaire, renvoyer alors au dit formulaire, vider le champ mal rempli, le colorer et afficher un message d'erreur. J'ai donc besoin simplement, tout simplement, de savoir laquelle de mes deux syntaxes est correcte, ou si les deux sont fausses, quelle serait celle valide. Merci

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 12:26
par Berzemus
C'est un peu ridicule d'utiliser ^ et $ dans ce cas, puisqu'ils ne valident que le début et la fin DE LA LIGNE (et donc, "quel con" passe sans soucis).

Je propose donc cette syntaxe-ci:

Code : Tout sélectionner

(\W|^)(con|joufflu|lapin)(\W|$)
Et je laisse votre expertise regex (puisque tout le monde semble en avoir tellement) décoder le truc.

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 12:40
par Neum
Bonjour Berzémus,

Et donc... merci de répondre à la question...

Je vous rassure d'emblée : je n'ai pas ni même aucune prétention "d'analyse" : les avis sont comme les trous du c..., tout le monde en a un...

Cela étant, j'essaie d'apprendre, comprendre, savoir pour alors utiliser et utiliser correctement. Cela me permet même ensuite, d'aider en retour. Bref.

Je viens donc de voir votre code. Ai-je tort en disant que votre code est quasi similaire à ma deuxième syntaxe, à ceci prêt que vous y avez ajouté "\W” soit donc "tout sauf une valeur alphanumérique" ? En revanche, sans doute votre précision sur le début et fin de ligne m'échappe-t-elle un peu puisque votre code, selon toutes vraisemblances, permet de contourner cette limitation. Je ne parviens pas à comprendre tout à fait que le simple fait d'inscrire dans votre code vos préfixes et suffixes (si j'ose dire) : (\W|^) et (\W|$) permettent de s'en affranchir.

A moins que le fait d'utiliser le "Ou" du regex ("|") et inséré dans un bloc de parenthèses autonome, contrôle soit le début soit la fin de la ligne, indépendamment l'un de l'autre, contrairement à ma syntaxe qui prenait en compte les deux simultanément... D'où le fait que "con" et "quel con" soient bloqués avec votre code, là où le mien n'interdisait que la première grossièreté.

Si j'ai mal compris et si vous avez un peu de temps pour simplement me l'expliquer, je vous en serais reconnaissant.

Quoiqu'il en soit merci. Bien cordialement à vous,
Neum

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 13:16
par stealth35
non \b ne va pas bloquer le mot conseil pusique tu met une limite de mot avant et après le mot,
test par toi même

http://regexr.com?2rp60

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 13:36
par Neum
Re-Bonjour Stealth35,

Votre solution du "\b" laisse passer une grossièreté du type "quel con"... Je viens de faire un test. Donc ça ne va pas.

En revanche la solution de Belzémus est opérationnelle. CELA ÉTANT, j'ai un dernier souci justement avec ce dernier regex :

Je ne parviens pas à le compléter du "i" pour l'insensibilité à la casse. J'ai essayé plusieurs options syntaxiques, rien à faire. Un dernier coup de main s'il vous plaît ?

(\W|^)(insulte1|insulte2|insulte3|)(\W|$)

Comment dois-je m'y prendre ? Merci beaucoup pour cette ultime aide...

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 13:37
par stealth35
Re-Bonjour Stealth35,

Votre solution du "\b" laisse passer une grossièreté du type "quel con"... Je viens de faire un test. Donc ça ne va pas.

En revanche la solution de Belzémus est opérationnelle. CELA ÉTANT, j'ai un dernier souci justement avec ce dernier regex :

Je ne parviens pas à le compléter du "i" pour l'insensibilité à la casse. J'ai essayé plusieurs options syntaxiques, rien à faire. Un dernier coup de main s'il vous plaît ?

(\W|^)(insulte1|insulte2|insulte3|)(\W|$)

Comment dois-je m'y prendre ? Merci beaucoup pour cette ultime aide...
mais non, ou alors tu t'en sert mal
$str 	 = 'un gros conseil';  // a changer en : un gros con
$insulte = preg_match('/\b(con|conne)\b/ui', $str);
	
if($insulte)
{
    echo 'pas valide';
}
else
{
    echo 'valide';
}

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 13:47
par Neum
Re...

je comprends ce que vous dites, mais le fait est que mon formulaire ne fonctionne pas de la sorte, au sens où j'ai une page de traitement qui renvoit vers le formulaire le cas échéant, etc... La page fonctionne, tout le code est valide, il ne manque plus que ce regex anti-insultes. Votre solution, je le vois bien ici, est correcte (d'ailleurs qui suis-je pour dire qu'elle ne l'est pas !) mais je ne peux pas m'en servir. Ce serait bien trop long et compliqué pour exposer le pourquoi du comment ici. Mais croyez-bien que je vous remercie chaleureusement du temps que vous me consacrez.

Pour l'heure, vraiment, j'ai juste besoin de savoir comment implanter l'insensibilité à la casse du regex précédent. Pouvez me dire comment faire ?

(\W|^)(insulte1|insulte2|insulte3)(\W|$)

Par avance, merci.

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 13:55
par stealth35
a quoi ressemble ton code ? comment est fait la validation alors ?

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 14:30
par Neum
Écoutez, ma page de traitement fait dans les 1500 lignes de code PHP, aussi je pense qu'il est largement us préférable de bien vouloir juste me dire comment implanter l'insensibilité a la casse du précédent regex. Vous voulez bien? Merci.
Cordialement et en vous remerciant encore,
Neum

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 14:47
par stealth35
Écoutez, ma page de traitement fait dans les 1500 lignes de code PHP, aussi je pense qu'il est largement us préférable de bien vouloir juste me dire comment implanter l'insensibilité a la casse du précédent regex. Vous voulez bien? Merci.
Cordialement et en vous remerciant encore,
Neum
ca dépend de ton code, je pense pas que juste le code pour les regexp fasse 1500 tu peu juste montrer la partie ou tu le fais

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 16:24
par Neum
Bon.... tout ça devient ridicule

Ecoutez, je suis en dehors de chez moi à présent et je poste depuis mon mobile. Donc je n'ai pas de copier-coller à faire et de toutes façons, encore une fois, si certes il est question de ma page de traitement en son entier qui recouvre donc quelques 1500 lignes voire même plus, il reste cependant que mes codes de vérifications sont eux aussi très nombreux, des centaines de lignes, et que par conséquent, cette discussion est stérile sinon même ubuesque.

J'ai juste posé une simple question : comment implanter la valeur "i" d'insensibilité de casse" dans le regex ci-dessous :

(\W|^)(insulte1|insulte2|insulte3)(\W|$)

C'est tout. C'est aussi simple que cela. Je veux compléter mon code avec ce regex, c'est mon choix, c'est comme ça que j'entends le faire. Je ne demande pas comment on fait en aspx, ni en java, ni en trucmuche, non : je veux juste connaître la réponse à la question que j'ai posée. Entendu ?
Il me semble qu'une personne aussi callée apparemment que vous l'êtes est parfaitement capable de me répondre. Je ne comprends donc pas du tout pourquoi une simple demande d'aide comme la mienne débouche sur un débat aussi surréaliste.

Je vous remercie une nouvelle fois du temps que vous me consacrez, de l'aide que vous voulez bien m'octroyer, mais s'il vous plaît, si vous voulez m'aider, répondez juste à ma demande. Merci.

Re: Problème de syntaxe d'un Regex

Posté : 13 juil. 2010, 16:31
par stealth35
t'es courageux a écrire autant avec ton mobile...
comme t'a l'air hyper motivé je t'invite a allé lire la doc de pcre la réponse si trouve http://perldoc.perl.org/perlre.html
comme je suis gentil : c'est la rubrique Extended Patterns