Vérification et correction regex svp

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 : Vérification et correction regex svp

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 03:36

J'essayerais, je pense que ça seras un truc du genre {1,3} à la fin.
du style

'@<citation(.*)>(.*)</citation>{1,3}@sU'

non?

Sinon j'aurais une regex pour faire les listes du style

<liste>
<puce>-</puce>
<puce>-</puce>
<puce>-</puce>
</liste>

Là je la sens plus coriace Oo

Merci de ton aide

Cordialement

Re: Vérification et correction regex svp

par Calimero » 13 févr. 2012, 03:18

Oo, ok là faut que tu m'explique parce que j'ai rien compris #-o

Le simple fait d'enlever les espace devant les parenthèses joue sur le fonctionnement de la regex?
Oui, un espace est un caractère actif participant à la définition du masque, comme presque tous les caractères (sauf ceux ayant une signification spéciale dans la syntaxe pcre, et il y en a pas mal, il est vrai :wink: ).

En supprimant l'espace de la partie "en dur" de la regexp tu as laissé le .* englober l'espace de manière optionnelle, ce qui du coup valide les deux formes de balise =D> C'est ce que j'avais tenté de t'expliquer avant.

Tu n'es donc pas obligé de tout gérer au caractère près dans une regexp. En fait, dans un souci de performance, il vaut mieux faire au plus court (mais quand même en écrivant les règles nécessaires pour que tout fonctionne bien) ;)
J'ai trois citations complex et une simples, et ça fonctionne Oo
if(preg_match('@<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Merci de ton aide

EDIT: j'ai rien dit, j'ai oublier qu'on était dans la regex, et que de se fait l’espace est pris comme caractères, surtout qu'on le rend obligatoire comme tu me la citer plus haut Oo
Maintenant tu as une regexp qui fonctionne, bravo. =D>

Comme tu le vois cette regexp contient des répétitions importantes dans le motif. Si tu veux passer à un nouvel exercice, plus corsé, pour encore mieux maîtriser les regexp, tu peux maintenant chercher à factoriser ces répétitions :) pour rendre ta regexp à la fois plus courte et plus lisible (enfin là c'est une question de goût et de point de vue :lol: )

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 02:47

Oo, ok là faut que tu m'explique parce que j'ai rien compris #-o

Le simple fait d'enlever les espace devant les parenthèses joue sur le fonctionnement de la regex?

J'ai trois citations complex et une simples, et ça fonctionne Oo
if(preg_match('@<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Merci de ton aide

EDIT: j'ai rien dit, j'ai oublier qu'on était dans la regex, et que de se fait l’espace est pris comme caractères, surtout qu'on le rend obligatoire comme tu me la citer plus haut Oo

Re: Vérification et correction regex svp

par Calimero » 13 févr. 2012, 02:36

Ok j'ai pas dû être clair... Désolé |*()

Essayons autrement... Il se passe quoi si tu enlèves simplement l'espace ? :-*

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 02:34

Ok je remet
if(preg_match('@<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)<citation  (.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
J'ai essayer de voir pour définir l'espace.

Mise à part ça, et ayant lu ce qui est plus haut en essayant de comprendre, je suis même aller voir deux trois tutos sur les regex, mais je ne sais toujours pas comment indiquer mes exceptions pour que les citations simples et complexes soient prisent en compte par ma regex.

Merci de ton aide

Cordialement

Re: Vérification et correction regex svp

par Calimero » 13 févr. 2012, 02:25

L'actuelle
if(preg_match('@<citation(\s)(.*)>(.*)<citation(\s)(.*)>(.*)<citation(\s)(.*)>(.*)<citation (\s)(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
J'ai pas beaucoup de maitrise des regex, je commence à peine à comprendre ^^
Ça va venir, on y travaille :)

Par contre :
Ce qui fait que ça devrais être (\s.*) non?
Ça pourrait marcher mais ce n'est même pas nécessaire, vu que le . peut remplacer n'importe quel caractère, c'est un caractère-joker. Le * est un quantifieur qui signifie "zéro ou plusieurs". Le motif .* peut donc attrapper absolument n'importe quoi... espace inclus :D
Je sais pas trop comment en me lisant tu t'es retrouvé à garder le \s et le mettre dans une parenthèse séparée ? Autant ta proposition initiale était bonne (au moins fonctionnelle) que là ben ça casse tout du coup, tu as rendu l'espace obligatoire à nouveau... :priere: C'est pourquoi les citations simples ne valident pas le masque.

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 02:18

La regex au moment ou j'ai poster le message:
if(preg_match('@<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)<citation  (.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
L'actuelle
if(preg_match('@<citation(\s)(.*)>(.*)<citation(\s)(.*)>(.*)<citation(\s)(.*)>(.*)<citation (\s)(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
J'ai pas beaucoup de maitrise des regex, je commence à peine à comprendre ^^

Re: Vérification et correction regex svp

par Calimero » 13 févr. 2012, 02:12

ça fonctionne bien pour les nom, mais si je met 4 citations dont 1 simples, il me dit pas l'erreur.
Peux-tu montrer ta regexp actuelle stp ?

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 02:09

ça fonctionne bien pour les nom, mais si je met 4 citations dont 1 simples, il me dit pas l'erreur.

Mis à part ce que je t'est dit plus haut, je ne vois pas ce que je pourrais faire pour les différentier.

Une solution?

Merci

Cordialement

Re: Vérification et correction regex svp

par Calimero » 13 févr. 2012, 02:06

dans la partie optionnel
Si tu en es toujours à la même version qu'au dessus, non, justement... Il était juste avant la parenthèse dans la dernière version que tu as postée ;)
Ce qui fait que ça devrais être (\s.*) non?
Ça pourrait marcher mais ce n'est même pas nécessaire, vu que le . peut remplacer n'importe quel caractère, c'est un caractère-joker. Le * est un quantifieur qui signifie "zéro ou plusieurs". Le motif .* peut donc attrapper absolument n'importe quoi... espace inclus :D

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 02:01

dans la partie optionnel

Ce qui fait que ça devrais être (\s.*) non?

Re: Vérification et correction regex svp

par Calimero » 13 févr. 2012, 01:54

un espace?

c'est tout ce que je vois (enfin presque Oo) ^^
Eh ben oui :) Et il est où cet espace actuellement ? dans une partie optionelle (couverte par un *) ou la partie "en dur" de la regexp ?

Re: Vérification et correction regex svp

par Fre3z69 » 13 févr. 2012, 01:43

un espace?

c'est tout ce que je vois (enfin presque Oo) ^^

Re: Vérification et correction regex svp

par Calimero » 12 févr. 2012, 23:50

if(preg_match('@<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Tu y es presque :D

maintenant observe bien une ouverture de citation simple :

Code : Tout sélectionner

<citation>
Et une avec le nom :

Code : Tout sélectionner

<citation nom="truc">
Quelle est la différence entre les deux ? Tu as pensé à :

Code : Tout sélectionner

nom="truc"
Et c'est très bien, mais n'as-tu pas oublié un tout petit détail qui explique ton souci ? quelquechose d'invisible... qu'on voit dans l'une mais pas dans l'autre... et qui devrait donc se retrouver dans la parenthèse si on veut capturer les deux :-*

Re: Vérification et correction regex svp

par Fre3z69 » 12 févr. 2012, 23:11

ça fonctionne

Maintenant pour utiliser la même regex qu'il y est un nom=? ou pas, comment dois je m'y prendre?

j'ai tester cette regex, ça prend que les nom=?, pas les simples citations
if(preg_match('@<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Merci de ton aide

Cordialement