Expression régulière

Fermé
Cisco_31 Messages postés 131 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 juin 2013 - 25 janv. 2010 à 17:52
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 25 janv. 2010 à 23:22
Bonjour,

Voilà je souhaiterai mettre en place une expression régulière qui interdit des extensions de fichier.
Je n'ai trouvé que le code pour autoriser des extensions:
^.+\.((jpg)|(gif)|(jpeg))$

ET comme je n'y connais rien en expression régulière... je me tourne vers vous.

Merci d'avance

9 réponses

blux Messages postés 26539 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 20 décembre 2024 3 317
25 janv. 2010 à 18:06
Salut,

c'est en quel langage ?
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
25 janv. 2010 à 18:22
Bonsoir,

“qui interdit des extensions de fichier“ .....
quid ?

Tu veux rechercher des noms de fichiers dans un texte, mais seulement ceux qui n’ont pas d’extension ?

Tu veux trouver les noms de fichiers sans n’importe quelle extension
ou sans certaines extensions spécifiées comme il s’en trouve dans la chaîne que tu donnes ?



À mon avis, il ne suffit pas de mettre .+\. devant l’indication qui excluera les extensions.

.+\. c’est trop vague comme caractérisation. Il est susceptible d’y avoir des mots jpeg,jpg,rtf etc dans un texte sans que ce soient des extensions dans un nom de fichier.

Il serait bon d’arriver à caractériser un peu mieux ce qui est susceptible d’être nom de fichier et ce qui ne l’est pas, dans un texte.
0
Cisco_31 Messages postés 131 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 juin 2013 16
25 janv. 2010 à 18:49
Merci de m'avoir répondu.

@blux: "c'est en quel langage ? "
Ben, c'est des expressions régulière.

@heyquem
Je n'ai pas compris ce que tu dis.

Je vais reformuler ce que je souhaite faire:
L'utilisateur clique sur un bouton parcourir et selectionne un fichier. Puis il clique sur le bouton upload (un peu comme sur le site https://www.virustotal.com/gui/
Je souhaiterai contrôler l'extension du fichier via une expression régulière. Je voudrais bloquer certaine extension (exemple: .exe, .dll)
Voilà, j'espère avoir était plus clair.

Avez vous une idée? Merci
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 janv. 2010 à 19:25
Salut,

Le langage est très important pour pouvoir implémenté la regex

Sinon, pour regex ça peut être ça - avec les test avant positif et négatif
$ ls -1
fic1.bmp
fic1.gif
fic1.jpeg
fic1.jpg
fic1.pl
fic1.txt
fic2.bmp
fic2.gif
fic2.jpeg
fic2.jpg
fic2.pl
fic2.txt
$ ls -1 | perl -ne 'print if /^.+\.(?=(?:jpg|gif|jpeg))/'
fic1.gif
fic1.jpeg
fic1.jpg
fic2.gif
fic2.jpeg
fic2.jpg
$ ls -1 | perl -ne 'print if /^.+\.(?!(?:jpg|gif|jpeg))/'
fic1.bmp
fic1.pl
fic1.txt
fic2.bmp
fic2.pl
fic2.txt


Mais ça peut être aussi ça avec la même regex mais en utilisant if et unless
n$ ls -1
fic1.bmp
fic1.gif
fic1.jpeg
fic1.jpg
fic1.pl
fic1.txt
fic2.bmp
fic2.gif
fic2.jpeg
fic2.jpg
fic2.pl
fic2.txt
$ ls -1 | perl -ne 'print if /^.+\.(?=(?:jpg|gif|jpeg))/'
fic1.gif
fic1.jpeg
fic1.jpg
fic2.gif
fic2.jpeg
fic2.jpg
$ ls -1 | perl -ne 'print unless /^.+\.(?=(?:jpg|gif|jpeg))/'
fic1.bmp
fic1.pl
fic1.txt
fic2.bmp
fic2.pl
fic2.txt

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 janv. 2010 à 19:36
Re,

Avec egrep
$ ls -1
fic1.bmp
fic1.gif
fic1.jpeg
fic1.jpg
fic1.pl
fic1.txt
fic2.bmp
fic2.gif
fic2.jpeg
fic2.jpg
fic2.pl
fic2.txt
$ ls -1 | egrep '^.+\.(jpg|gif|jpeg)'
fic1.gif
fic1.jpeg
fic1.jpg
fic2.gif
fic2.jpeg
fic2.jpg
$ ls -1 | egrep -v '^.+\.(jpg|gif|jpeg)'
fic1.bmp
fic1.pl
fic1.txt
fic2.bmp
fic2.pl
fic2.txt
0
Cisco_31 Messages postés 131 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 juin 2013 16
25 janv. 2010 à 20:26
Bon, je crois que je vais abandonner les expressions régulières. Je ferai autrement
Merci quand même!
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
25 janv. 2010 à 21:12
Euh.....lami20j, ce sont des expressions régulières exprimées en ligne de commande ?

Tout ça n’est pas très clair.
Tu pourrais signaler

- que tu répètes
$ ls -1 | perl -ne 'print if /^.+\.(?=(?:jpg|gif|jpeg))/'

- que
$ ls -1 | perl -ne 'print if /^.+\.(?=(?:jpg|gif|jpeg))/'
et
$ ls -1 | egrep '^.+\.(jpg|gif|jpeg)'
sont équivalentes

- que
$ ls -1 | perl -ne 'print if /^.+\.(?!(?:jpg|gif|jpeg))/'
et
$ ls -1 | perl -ne 'print unless /^.+\.(?=(?:jpg|gif|jpeg))/'
et
$ ls -1 | egrep -v '^.+\.(jpg|gif|jpeg)'
sont équivalentes



Pour ma part, je ne pense pas que le langage soit TRÈS important pour écrire des regex. Le cœur des regex est le même d’un langage à un autre. Il y a des petites variations selon le langage, certains ne comportent pas la totalité des possibilités d’un moteur de regex; Perl étant, je crois, le langage dans lequel les regex sont les plus puissantes.

D’un langage à l’autre, il y a la façon d’écrire ce qu’il y a autour d’une RE qui varie , mais la façon d’écrire une RE est assez indépendante du langage. Enfin, je crois.





Enfin, tout ça ne répond pas au problème de Cisco_31.
Malgré tes explications supplémentaires, Cisco, je ne comprends pas encoe ce que tu veux.

« contrôler l'extension du fichier » sélectionné
«bloquer certaine extension»
qu’est ce que ça veut dire ?

Il s’agit de noms de fichiers dans un menu déroulant ? Et non pas dans un texte ?

Pourquoi ne pas controler la présence des fichiers dans le menu déroulant au lieu de vouloir les controler quand un utilisateur fait un choix ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 janv. 2010 à 21:29
Salut,

Tout ça n’est pas très clair.
Tu pourrais signaler
...
sont équivalentes


C'est déjà fait ;-)
Mais ça peut être aussi ça avec la même regex mais en utilisant if et unless
Et d'ailleurs ça se voit, pourquoi j'aurais eu besoin de le dire? ;-))

mais la façon d’écrire une RE est assez indépendante du langage. Enfin, je crois.
Je suis d'accord sur ce point.
Toutefois on a besoin de langage pour l'implémenter par pour l'écrire, si tu vois ce que je veux dire.
On peut penser en faisant des test avant ou arrière, mais ça ne sers à rien si l'application/langage qui utilise la regex n'accepte pas les tests avant/arrière par exemple.

Dans son cas, je ne pense pas que c'est si compliqué.
En actionnant le bouton upload il peut écrire un petit script qui vérifie si le fichier a une certain extension ou pas.
Dans son cas la regex et bonne.
Il suffit de l'intégrer correctement et pour ça il faut savoir le langage, non?

if( regex (dll,exe))
  pas upload
else
  upload


P.S. Si le langage n'était pas important tu n'aurais pas dit ça ;-) (on parle toujours de l'implémentation)
Tu sauras alors si les look ahead et behind assertions sont supportées par JavaScript
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
25 janv. 2010 à 22:39
Je n’ai pas dit que le langage ne compte pas du tout. Je dis que les variations d’écriture dépendantes du langage sont un épiphénomène par rapport au problème central de savoir comment écrire une RE.

Quand j’écris RE, je désigne une chaîne de caractères.
Ensuite, la façon dont une RE est utilisée par un programme écrit dans un langage donné pour en tirer un objet regex, c’est une autre histoire.



Concernant
«Tu sauras alors si les look ahead et behind assertions sont supportées par JavaScript»
tu as un peu raison: si les assertions avant-arrière sont disponibles ou non selon le langage, c’est bien le langage qui fait la différence.
Mais si le langage détermine la disponibilité, il ne détermine pas l’écriture. D’un langage à un autre ces assertions, quand elles sont disponibles, s’écrivent de la même façon. C’est ça que j’ai voulu dire. Je ne parlais pas d’implémentation.







Alors je vois en relisant ton post que tu as écrit
«Le langage est très important pour pouvoir implémenté la regex»

Pour ma part, j’évite le plus possible d’employer les termes d’implémenter et implémentation parce que j’ai la forte impression que ces termes sont dans la plupart des cas employés sans que ceux qui les utilisent sachent vraiment ce qu’ils veulent dire exactement. Je me demande d’ailleurs s’il existe réellement une définition canonique, autorisée, pensée, correcte, etc et tout ce qu’on voudra, ou si ce sont des termes fumeux qui sont employés parce que ça fait bien et que ça donne une tournure informatique au propos même si on ne sait pas exactement ce qu’on veut dire avec ces termes. Je ne crois pas que ce soit le cas: il doit y avoir des profs et des calés en informatique qui savent exactement ce que ces termes recouvrent. Mais dans la masse des informaticiens moyens (dont je fais partie), je suis convaincu qu'il y en a beaucoup qui emploient ces termes au pifomètre et qui seraient infoutus d'expliquer ce qu'ils désignent

Je ne dis pas que c’est ton cas. Tu sembles au contraire employer ces termes en connaissance de cause:
«on a besoin de langage pour l'implémenter par pour l'écrire, si tu vois ce que je veux dire. »

J’avoue que quand j’ai lu ton premier message, j’ai toutefois pensé plus ou moins consciemment que tu écrivais
«Le langage est très important pour pouvoir implémenté la regex »
comme tu aurais écrit
«Le langage est très important pour pouvoir écrire la regex »
J’avoue ma faute de paresse intellectuelle.



Il n’en reste pas moins que je ne suis pas encore tout à fait d’accord:

un moteur de regex est déjà implémenté dans un langage, on n’a pas la possibilité d’implémenter une regex, et non je ne vois donc pas ce que tu veux dire.
Une regex (un objet regex) est créée par le fonctionnement du programme écrit dans un langage dont les possibilités sont pré-implémentées, on n’intervient pas à ce niveau mais seulement au niveau d’un agencement des instructions et de l’écriture de la RE.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
25 janv. 2010 à 23:22
Re,

Une regex (un objet regex) est créée par le fonctionnement du programme écrit dans un langage dont les possibilités sont pré-implémentées, on n’intervient pas à ce niveau mais seulement au niveau d’un agencement des instructions et de l’écriture de la RE.
Dans ce cas ce n'est pas pareil.
Par exemple en Perl, regex et objet regex sont deux choses différentes.
D'une côté un a la regex et de l'autre on a l'opérateur qr// qui permet de créer un objet regex.
L'objet regex peut servir :
- pour l'encapsulation de regex pour les utiliser dans des regex plus grandes
- pour l'efficacité, contrôler quand une regex est compilée

En ce qui concerne le niveau d'intervention je suis d'accord avec toi.
Tout ce que nous les utilisateurs on peut faire c'est d'écrire une regex ou créer un objet regex et si besoin de comprendre le fonctionnement du moteur pour l'efficacité des regex.

En réalité je pense qu'on est plutôt d'accord, mais peut être que j'ai du mal m'exprimer ;-)

0