IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[REGEX] Pb d'expression reguliere


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut [REGEX] Pb d'expression reguliere
    j'ai quelques soucis avec les expressions regulieres :

    Contexte : J'ai un script perl qui me genere un script html avec une methode GET, et je souhaite recuperer mes champs et leurs valeurs.

    Type de chaine a traiter $ENV{QUERY_STRING} : Interlocuteur=toto&champ1=&Champ2=Hauteur+support&Champ3=Alimentation&champ4=Taille+caisson&champ5=&Valider=Valider&.cgifields=champ2&.cgifields=champ3&.cgifields=champ4

    a) J'arrive a extraire le nom d'un champ a l'aide d'une variable :

    $traitement =~ m/@param[$iR]/;
    print $traitement;

    mais pas le contraire, cad que je voudrais tout sauf le nom de mon champ. J'ai essaye ca (ci-dessous), mais ca ne marche pas.

    $traitement =~ m/[^@param[$iR]]/;
    print $traitement;

    b) j'ai fait une boucle pour extraire toutes mes valeurs :

    my $requete = $ENV{QUERY_STRING};
    # Les valeurs contenues a partir de la mention "Valider" sont supprimmees
    $requete =~ s/&Valider.*$//;
    $traitement = $requete;

    # Boucle pour extraire les champs de la requete et leurs valeurs
    foreach (@param)
    {
    # extraction du premier champ de la requete
    if ($iR == 0)
    {
    $traitement =~ s/&.*//;
    $worksheet->write($iR, 1, $traitement);
    }
    # extraction des autres champs
    else
    {
    $traitement =~ s/[^@param[$iR]]//;
    $worksheet->write($iR, 1, $traitement);
    }

    $iR++;
    }

    et voila ce qu'elle me donne :

    Interlocuteur=toto
    nterlocuteur=toto
    nerlocuteur=toto
    nelocuteur=toto
    nelcuteur=toto
    neluteur=toto
    eluteur=toto
    euteur=toto
    euteurtoto
    eteurtoto
    eeurtoto
    eurtoto
    euroto
    eroto
    roto
    oto
    oto
    oto
    to

  2. #2
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    pourkoi tu fais du GET ? le POST c'est mieux !!!
    pourkoi tu fais la récup des infos en manuel ?!?
    utilise un objet CGI !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    use CGI;
     
    my $query=new CGI;
    my $interlocuteur=$query->param('Interlocuteur');
    my $interlocuteur=$query->url_param('Interlocuteur') unless (defined($interlocuteur));
    my $interlocuteur='none' unless (defined($interlocuteur));
    Bref, dans l'ordre, on teste de récup l'info en post, si y en a pas on récup celle en GET et si toujours pas on peut y affecter une valeur au choix....
    va faire un tour sur CGI chez CPAN.. here

    PS : sinon pour faire ça en manuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    read(STDIN, $in, $ENV{CONTENT_LENGTH});
    my @champs = split(/&/,$in);
    foreach (@champs){
        my ($key, $val)=split(/=/,$_);
        print "($key,$val)\n";
        if ($key=~/^Interlocuteur$/){
            $interlocuteur=$val;
        }
        elsif ($key=~/^champ1$/){
            $champ1=$val;
        }
        .
        .
        .
    }
    voilà...
    ++

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    euh bah en fait jjj uis pas d'avoir bien compris la difference entre e GET et le POST. Pour moi, le POST envoie un mail et je ne voyais pas l'interet de decortiquer un mail. De plus, le GET ne semblait plus simple a mettre en oeuvre.

    Cela dit, j'utilise un objet CGI, mais avec url_param, j'ai trop de bazar a decortiquer c'est pourquoi je me suis tourner vers $ENV{QUERY_STRING}

    En tout cas, merci je vais aller voir le CGI de CPAN

  4. #4
    Membre habitué

    Inscrit en
    Janvier 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Points : 142
    Points
    142
    Par défaut
    POST est arrivé après GET il me semble car pb du GET : dans l'URL y a une taille limite. Avec POST on est trankil : au lieu de mettre les infos ds l'URL, on met tout ça ds l'entête HTML => plus de souci de taille
    en plus cé mieux niveau clarté (ton URL ne change pas) et au niveau sécu : les infos ne sont pas visibles directement.

    Sinon, bah, j'pensas qu'tu connaissais pas url_param. j'ai pas trop compris pourquoi t'as pas envie de l'utiliser :s
    ça veut dire quoi "trop de bazar a decortiquer" ?
    si tu le fais en manuel et que tu souhaites stocker les valeurs, cé carrément plus chiant : obligé de faire un switch (if, elsif, elsif,...,else)

    Rq : j'pense qe le ptit bout d'code avec les split que j't'ai mis doit bien marcher... teste le
    ++

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    bon, je vois que tu te melanges les pédales. Conseil, lis un bout de FAQ :
    - http://perl.developpez.com/faq/?page...36#sectionC36b (petit exemple de CGI)
    - doc cpan en francais sur les CGI : http://perl.enstimac.fr/ModulesFr/CGI.html

    Et pour info
    utilise toujours use strict; et use Carp;

    Sinon pour récuperer les noms des champs que ce soit en post ou en GET,
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $cgi = new CGI;
    my $champ_toto = $cgi->param("nom_camp_toto");
    etc.
    Sinon tout est expliqué dans la doc en francais. Lis toute la doc, c'est tres tres bien expliqué. Si t'as d'autre soucis, on t'aidera aprés.
    voilà, courage

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    ramislebob :
    ----------------

    ça veut dire quoi "trop de bazar a decortiquer" ?
    eh bien ca veut dire que quann tu recois qqc de ce type :
    : htp://localhost/xampp/test_devis.pl?Interlocuteur=bob&Societe=tattt&TypePanneau=Danger&GammePanneau=Panneau+LEDs&ClassePanneau=Classe+1&TaillePanneau=Petite&Mat=Oui&Diametre=125+mm&Hauteur=1+metre&ChoixCollier=Simple&ChoixAffichage=Contour&NbLEDs=2+rangees&CouleurLEDs=Ambre&Alimentation=ALIM+ECLAIRAGE+PUBLIQUE&ChoixOptions=ARMOIRE&Caisson=Miniature&RevetementCaisson=Brut&Commentaires=+cxvfdht&Valider=Valider&.cgifields=ChoixAffichage&.cgifields=Mat&.cgifields=RevetementCaisson&.cgifields=CouleurLEDs&.cgifields=TaillePanneau&.cgifields=ClassePanneau&.cgifields=GammePanneau&.cgifields=NbLEDs&.cgifields=ChoixCollier&.cgifields=ChoixOptions&.cgifields=TypePanneau&.cgifields=Diametre

    tu dois t'amuser avec les REGEX pour faire une jolie boucle qui te recupere tes infos. Mais maintenant j'utilise :

    my $interlocuteur=$form->param("Interlocuteur");
    my @param=$form->param();

    le code est lourd mais ca l'airfonctionnel, de plus pour l'instant j'ai conserve la methode GET, ca marche ! Donc on verra plus tard pour le post. J'essaie de selectionner les infos du formulaire pour creer un fichier excel


    ==================

    Djibril :
    ---------

    Euh, je suis d'accord avecsur le fait que je me melange un peu les pedales.
    En effet, j'ai deja fait un tour sur les liens que tu m'as indique. Mais ca reste flou.
    J'utilise egalement le strict, ....

    #!/opt/lampp/bin/perl



    # Inclusion des librairies :
    # --------------------------

    use strict;
    use CGI;
    use HTML:arser;
    use LWP::UserAgent; # Client html
    use Spreadsheet:arseExcel; # charge les routines d'extraction des donnees excel.
    use Spreadsheet:arseExcel::SaveParser; #
    use Spreadsheet::WriteExcel; # charge les routines de creation de documents excel.
    use Parse::RecDescent;
    use CGI::Carp qw(fatalsToBrowser); # Fonction permettant de tansmettre les message d'erreur Perl dans le navigateur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [regex][c#] Expression reguliere fausse
    Par zulot dans le forum C#
    Réponses: 12
    Dernier message: 31/08/2007, 15h23
  2. débutant regex expression reguliere
    Par mhamedbj dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2007, 19h44
  3. Réponses: 6
    Dernier message: 14/11/2006, 16h17
  4. [Regex]Expression régulière
    Par Guillaume Bénétrix dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 06/12/2005, 01h21
  5. [RegEx] Expression reguliere (regex)
    Par atovik dans le forum Langage
    Réponses: 2
    Dernier message: 24/11/2005, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo