validation d'une saisie utilisateur avec wildcard autorisé
|
11-01-2015, 22h53
(Modification du message : 11-01-2015, 22h54 par gruik.)
Message : #1
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
validation d'une saisie utilisateur avec wildcard autorisé
dans un script je check un paramètre utilisateur, lequel paramètre est censé être une adresse IP plus ou moins complète avec éventuellement un (unique) wildcard
le wildcard c'est classiquement l'astérisque '*', et on ne cherche *pas* à vérifier que chaque nombre composant l'IP est dans l'intervalle qui convient [0-255], on se contente de valider que le nombre comporte au maximum 3 chiffres significatifs (donc [0-999]) du coup les saisies suivantes sont correctes : Code : 1.1.1.1 tandis que les saisies suivantes sont invalides : Code : *.* voila et je cherche à valider ça à travers une regex, évidement
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
20-01-2015, 01h09
Message : #2
|
|
Yttrium
Membre actif Messages : 106 Sujets : 14 Points: 48 Inscription : Jul 2012 |
RE: validation d'une saisie utilisateur avec wildcard autorisé
Alors je ne sais pas si je vais t'aider avec ce que je vais dire, mais au pire, ça servira juste a rien
Théoriquement tu peux faire une condition : (?(?=regex)then|else) Donc un truc du style (? (?=\*) *.[0-999].[0-999].[0-999] | [0-999].[0-999].[0-999].[*0-999]) Mais vu que je suis une bille en regex, je sais que la mienne ne fonctionne pas, mais l'idée est peut être intéressante ? ou totalement con x) |
|
20-01-2015, 10h00
Message : #3
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: validation d'une saisie utilisateur avec wildcard autorisé
oui en fait je pense qu'il faut découper en 3 cas distincts
- la chaine contient un wildcard au debut - la chaine ne contient pas de wildcard - la chaine contient un wildcard à la fin chaque cas séparé effectivement par un |, ça fait un truc un peu à rallonge mais bon la chaine contient un wildcard au début : ^\*(?:\.[0-9]{1,3}){0,3}$ la chaine ne contient pas de wildcard : ^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$ la chaine contient un wildcard à la fin : ^(?:[0-9]{1,3}\.){0,3}\*$ donc la regex complète serait un truc du genre : ^\*(?:\.[0-9]{1,3}){0,3}$|^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$|^(?:[0-9]{1,3}\.){0,3}\*$ la vérification : Code BASH :
$ cat vrai
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
20-01-2015, 10h41
(Modification du message : 20-01-2015, 10h43 par b0fh.)
Message : #4
|
|
b0fh
Membre actif Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: validation d'une saisie utilisateur avec wildcard autorisé
Hello,
Je te propose la regex suivante, de longueur a peu près comparable: Code : ~$ grep -P '^\*(?:\.\d{1,3}){0,3}$|^\d{1,3}\.(?:\*|\d{1,3}\.(?:\*|\d{1,3}\.(?:\*|\d{1,3})))$' <<TEST Donne Code : 1.1.1.1 J'ai gagné un peu d'espace en remplaçant [0-9] par \d, j'en ai un peu perdu en fusionnant tes cas 2 et 3 et en développant les branches à la main. Ceci permet d'éviter trop de backtracking. Dans le cas le plus marqué, on observe un gain de 40% (mais sûrement beaucoup moins sur un cas moyen) Code : $ export RE_GRUIK='^\*(?:\.[0-9]{1,3}){0,3}$|^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$|^(?:[0-9]{1,3}\.){0,3}\*$' |
|
« Sujet précédent | Sujet suivant »
|
Utilisateur(s) parcourant ce sujet : 2 visiteur(s)