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 :

Php en perl, probleme html::parser


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut Php en perl, probleme html::parser
    Bonjour,

    je souhaite mettre mon plugin de nagios (connexion au nas bufallo + reboot) en perl mais j'ai bcp de mal a trouvé l'équivalent de mon code php. J'ai trouvé la fonction html:parser mais je n'arrive pas a comprendre son fonctionnement parfaitement.

    plugin nas.sh
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
     
    include_once("simple_html_dom.php");
     
    // initialisation de la session
     
    $curl = curl_init();
     
    $post_data = "txtAuthLoginUser=login&txtAuthLoginPassword=motdepasse&gPage=top&gMode=auth&txtHelpSearch=&gPage=top&gMode=&gType=auth&gKey=&gSSS=&gRRR=&hiddenDummyText=dummy";
     
    // configuration des options
     
    //URL a recuperer
    curl_setopt($curl, CURLOPT_URL,"http://XXX.XXX.XXX.XX/cgi-bin/top.cgi");
     
    //TRUE pour que PHP fasse un HTTP POST
    curl_setopt($curl, CURLOPT_POST, 1);
     
    //Toutes les donnees a passer lors dune operation de HTTP POST.
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
     
    //TRUE retourne directement le transfert sous forme de chaine de la valeur retourner par curl_exec() au lieu de lafficher directement.
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     
    // execution de la session
     
    $page = curl_exec($curl);
     
    // fermeture des ressources
    curl_close($curl);
     
    // / / Cree un objet DOM a partir dune URL
    $html = str_get_html($page);
     
    //Cherche le bouton de type hidden et lire son contenu
    foreach($html->find('input[type=hidden]') as $input) {
            $tmp_data = $input->outertext;
     
    //Recherche par expression rationnelle insensible a la casse et recuperer les valeurs du champ value
            if (eregi('gSSS', $tmp_data)){
                    $gSSS =  $input->getAttribute("value");
            }
            if (eregi('gRRR', $tmp_data)){
                    $gRRR =  $input->getAttribute("value");
            }
     
     
    }
     
    print $gSSS . " / " . $gRRR;
     
    // etape 2 reboot :
    $curl = curl_init();
     
    $post_data = "txtHelpSearch=&gPage=maintenance&gMode=shutdown&gType=reboot&gKey=undefined&gSSS=" . $gSSS . "&gRRR=". $gRRR . "&hiddenDummyText=dummy";
    curl_setopt($curl, CURLOPT_URL,"http://XXX.XXX.XXX.XX/cgi-bin/top.cgi");
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $page = curl_exec($curl);
    curl_close($curl);
     
     
    if (eregi('Restarting the LinkStation now.',$page)){
            print "Good job :) ";
    }else{
            print "Echec redemrrage";
    }
     
    //print $page;
     
    ?>
    :

    voici mon 1er code Perl:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #!/usr/bin/perl
    use strict;
    use warnings;
    use HTML::Parser;
     
    my $page = "http://XX.XX.XX.XX/cgi-bin/top.cgi";
     
    # création de mon parser
    my $parser = HTML::Parser->new();
     
    # définition des mes evenements
    $parser->handler( text  => \&text,  "dtext" );
    $parser->handler( start => \&start, "tagname,attr" );
    $parser->handler( end   => \&end,   "tagname" );
     
    $parser->parse($page);
     
    # définition des callbacks
    # on les rassemble dans un bloc pour que les variables lexicales
    # sur lesquels on les clos soient invisibles du reste du script
     
    print get_data();
     
    {
        my $in_span_textegras;
        my @data;
     
        sub start {
            my ($tag, $attr) = @_;
            $in_span_textegras++
                if $tag eq 'input' and $attr->{type} eq 'hidden';
        }
     
        sub end {
            my ($tag) = @_;
            $in_span_textegras--
                if $tag eq 'input' and $in_span_textegras;
        }
     
        # tu souhaiteras peut-être faire ton traitement directement
        # dans cette fonction
        sub text {
            my ($text) = @_;
            push @data, $text
                if $in_span_textegras;
        }
     
        # si tu fais le traitement dans text() tu n'auras pas besoin
        # de cette fonction
        sub get_data {
            return @data;
        }
     
    }
    Mais rien n'est renvoyé.

    Ni avec ce deuxieme code perl

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/usr/bin/perl -w
     
    use strict;
    package GetSummary;
    use base "HTML::Parser";
     
    my $self = "http://XX.XX.XX.XX/cgi-bin/top.cgi";
     
    #my $text = "Restarting the LinkStation now."
     
    my $meta_gSSS;
    my $meta_gRRR;
    my $h1_flag;
    my $meta_reboot;
     
    my $post_data = "txtAuthLoginUser=login&txtAuthLoginPassword=motdepasse&gPage=top&gMode=auth&txtHelpSearch=&gPage=top&gMode=&gType=auth&gKey=&gSSS=&gRRR=&hiddenDummyText=dummy";
     
    sub start {
            my ($self,$post_data, $tag, $attr) = @_;
     
            if ($tag =~ /^input$/i && $attr->{'type'} =~ /^hidden$/i) {
            # Si on trouve  <INPUT Type=hidden>
                    $meta_gSSS = $attr->{'gSSS'};
            }
     
            if ($tag =~ /^input$/i && $attr->{'type'} =~ /^hidden$/i) {
            # Si on trouve  <INPUT Type=hidden>
                    $meta_gRRR = $attr->{'gRRR'};
     
            }
     
            print  $meta_gRRR;
    my $text2 = "txtHelpSearch=&gPage=maintenance&gMode=shutdown&gType=reboot&gKey=undefined&gSSS=".$meta_gSSS."&gRRR=".$meta_gRRR."&hiddenDummyText=dummy";
          }
    # pour le reboot
     
    sub text {
     
            my ($self,$tag2, $attr2, $text2) = @_;
     
            if ($tag2 =~ /^input$/i && $attr2->{'type'} =~ /^reboot$/i) {
            # Si on trouve  Restarting the LinkStation now.
     
            $meta_reboot = $attr2->{'Restarting the LinkStation now.'};
            }
    }
     
    sub end {
          my ($self, $tag, $origtext) = @_;
     
          # reset appropriate flag if we see </H1> or </TITLE>
          if ($tag =~ /^h1$/i)    { $h1_flag = 0; }
          if ($tag =~ /^title$/i) { $h1_flag = 0; }
     
          if ($tag =~ /^title$/i) { $h1_flag = 0; }
      }
     
      my $p = new GetSummary;
      while (<>) {
          $p->parse($_);
      }
      $p->eof;
     
      print "Summary information: ", $meta_gSSS || $meta_gRRR || "No summary information found.", "\n";
    Quelqu'un pourrait me guidé un peu svp?

  2. #2
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    Et si tu n'essayais pas de traduire ton code PHP, mais que tu résonnais directement en PERL ?

    Peut tu expliquer ce que tu souhaites faire ?

    Après je n'ai jamais "traduit" du PHP en PERL mais d'après mon experience avec d'autres lamgages, traduire n'est jamais une bonne chose... Il vaut mieux repartir de 0 en conservant l'idée de ce que doit faire le script

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Bonjour,

    je souhaite rebooter mon nas directement en faisant une simulation de connexion en http sur mon interface web du buffalo.

    Donc, cela j'ai réussi en écrivant ceci :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
        #!/usr/bin/perl -w
        use strict;
        use LWP::UserAgent;
        use HTML::Form;
        use warnings;
        use HTML::Parser;
     
        # les paramètres personnels
        my ( $user, $pass ) = qw( login password );
        my $base = 'http:/XXX.XXX.XXX.XXX/cgi-bin/top.cgi';
     
        # initialisation de l'agent
        my $ua = LWP::UserAgent->new();
     
        # création de la requête
        my $req = HTTP::Request->new( GET => $base );
     
        # exécute la requête et reçoit la réponse
        my $res = $ua->request($req);
        die $res->status_line if not $res->is_success;
     
     
        # le formulaire de login est le second formulaire de la page
        my $form = ( HTML::Form->parse( $res->content, $base ) )[0];
     
        # remplit les champs
        $form->find_input("txtAuthLoginUser")->value($user);
        $form->find_input("txtAuthLoginPassword")->value($pass);
     
        # valide et renvoie le formulaire
        #$ua->request( $form->click );
     
        my $validate = $ua->request( $form->click );
        my $page = $validate->content;
        print $page;
    Donc, cela me renvoi le code source, ou je peux chercher mes valeurs suivantes :
    $post_data = "txtAuthLoginUser=login&txtAuthLoginPassword=motdepasse&gPage=top&gMode=auth&txtHelpSearch=&gPage=top&gMode=&gType=auth&gKey=&gSSS=&gRRR=&hiddenDummyText=dummy";
    Je souhaite, récupérer ensuite les valeurs de gSSS et de gRRR du bouton <input type=hidden>

    Pour ce faire, je veux utiliser HTML:Arser mais je ne comprend pas comment faire. j'ai continué mon script perl avec ceci sans succès:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     # creation de mon parser
        my $parser = HTML::Parser->new();
     
        # definition des mes evenements
        $parser->handler( text  => \&text,  "dtext" );
        $parser->handler( start => \&start, "tagname,attr" );
        $parser->handler( end   => \&end,   "tagname" );
     
        $parser->parse($page);
     
        # definition des callbacks
        # on les rassemble dans un bloc pour que les variables lexicales
        # sur lesquels on les clos soient invisibles du reste du script
     
    print get_data();
     
    {
        my $in_input_textegras;
        my $meta_gSSS;
     
        sub start {
            my ($tag, $attr) = @_;
            $in_input_textegras++
                if $tag eq 'input' and $attr->{type} eq 'hidden';
        }
     
        sub end {
            my ($tag) = @_;
            $in_input_textegras--
                if $tag eq 'input' and $in_input_textegras;
        }
     
        # tu souhaiteras peut-etre faire ton traitement directement
        # dans cette fonction
        sub text {
            my ($page,$meta_gSSS) = @_;
            push $meta_gSSS, $page
                if $in_input_textegras;
                    }
     
    }
    Je bloque sur la façon de recupere mes valeurs.

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Je bloque au niveau de l'accès à la page "maintenance" qui était définit dans la variable post_data :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $post_data = "txtHelpSearch=&gPage=maintenance&gMode=shutdown&gType=reboot&gKey=undefined&gSSS=" . $gSSS . "&gRRR=". $gRRR . "&hiddenDummyText=dummy";
    Car la mon script perl, permet de me connecter a l'interface.

    Une fois dessus, je souhaite me positionner sur la page "Maintenance" afin d'effectuer mon reboot.(defini dans fichier php dans la variabel precedente).

    il faudrait pas plutot que j'utilise la méthode

    $form->find_input
    Car, dans mon fichier perl, cela ne sert a rien de chercher les valeurs gSSS et gRRR, qui me permettaient de garder la conexion admin sur mon fichier PHP.

    La il faut que je cherche le champ post_data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $post_data = "txtAuthLoginUser=login&txtAuthLoginPassword=motdepasse&gPage=top&gMode=auth&txtHelpSearch=&gPage=top&gMode=&gType=auth&gKey=&gSSS=&gRRR=&hiddenDummyText=dummy";
    et que je remplace par le premier post_data si j'ai bien compris?

  5. #5
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    Alors la je suis perdu... je vois pas comment t'aider en PERL car je n'arrive pas comprendre ce que tu veux faire précisement.

    Si tu oublies ton PHP et que tu nous explique ce que tu veux faire en PERL, ca donne quoi ? Car la personnellement je m'y retrouve pas.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    J'explique le principe:

    1) je me connecte sur la page
    http://XXX.XXX.XXX.XX/cgi-bin/top.cgi");
    2) il faut entrer un login et un pass qui sont respectivement dans les champs txtAuthLoginUser et txtAuthLoginPassword :

    d'ou le code suivant:
    # remplit les champs
    $form->find_input("txtAuthLoginUser")->value($user);
    $form->find_input("txtAuthLoginPassword")->value($pass);
    3) une fois connecté, les champs gSSS /gRRR (champ hidden) génèrent des numéros aléatoire qui permettent de rester connecté avec le login/pass entré précédemment pour naviguer dans les divers menus de l'interface.

    4) Moi, je souhaite ensuite aller dans le menu qui s'appelle "Maintenance" et dans le sous-menu "Restart". sur la page de ce sous-menu, il y a un bouton nommé "reboot" qui redémarre le NAS.

    5) Mon script me connecte a la page du Nas et me génère le formulaire de la page d'accueil. dans ce formulaire,il a ces valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #<input type="hidden" id="gPage" name="gPage" value="top" />
    #<input type="hidden" id="gMode" name="gMode" value="" />
    #<input type="hidden" id="gType" name="gType" value="auth" />
    #<input type="hidden" id="gKey"  name="gKey"  value="" />
    #<input type="hidden" id="gSSS"  name="gSSS"  value="464e3f2XXXXXc29a937e16478a9" />
    #<input type="hidden" id="gRRR"  name="gRRR"  value="45XXXXXX739" />
    Je souhaite récupéré les valeurs (value) de gRRR et de gSSS afin de rester connecter avec la même session pour aller sur la page de reboot.

    la page de reboot prendre les valeurs suivantes normalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #<input type="hidden" id="gPage" name="gPage" value="maintenance" />
    #<input type="hidden" id="gMode" name="gMode" value="shutdown" />
    #<input type="hidden" id="gType" name="gType" value="reboot" />
    #<input type="hidden" id="gKey"  name="gKey"  value="" />
    #<input type="hidden" id="gSSS"  name="gSSS"  value="464e3f2XXXXXX031c298d0a938a9" />
    #<input type="hidden" id="gRRR"  name="gRRR"  value="4517625XXXXXX1739" />
    Donc, si je récupère bien mes 2 variables et que je passe mes valeurs gMode/gType/gPage comme ci-dessus, cela devrait simuler le clique sur el bouton "reboot" non?
    en se connectant sur cette dernière cela reboot automatiquement mon nas

  7. #7
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    En supposant que tu mette les lignes de ton formulaire dans une variable " @line ", tu peux récuperer tes informations " gSSS " et " gRRR " de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my $gSSS;
    my $gRRR;
    foreach my $l (@line){
          if($l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/){
                $gSSS = $1;
          }
           if($l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/){
                $gRRR = $1;
          }
    }
    Si j'ai pas fait d'erreur dans la REGEXP, les variables "gSSS" et "gRRR" devraient contenir les valeurs que tu recherches.

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Le code suivant devrait me mettre les bonnes valeurs non? je n'ai rien dans mes variables gSSS et gRRR.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     #!/usr/bin/perl -w
        use strict;
        use LWP::UserAgent;
        use HTML::Form;
        use warnings;
        use HTML::Parser;
        use Data::Dumper;
     
        # les paramètres personnels
        my ( $user, $pass ) = qw( login pass );
        my $base = 'http://XXXXX/cgi-bin/top.cgi';
     
        # initialisation de l'agent
        my $ua = LWP::UserAgent->new();
     
        # création de la requête
        my $req = HTTP::Request->new( GET => $base );
     
        # exécute la requête et reçoit la réponse
        my $res = $ua->request($req);
        die $res->status_line if not $res->is_success;
     
     
        # le formulaire de login est le premier formulaire de la page
        my $form = ( HTML::Form->parse( $res->content, $base ) )[0];
     
        # remplit les champs
        $form->find_input("txtAuthLoginUser")->value($user);
        $form->find_input("txtAuthLoginPassword")->value($pass);
     
     
        my $validate = $ua->request( $form->click );
        my @page = $validate->content;
     
        my $gSSS;
        my $gRRR;
     
        foreach my $l (@page){
          if($l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/){
                $gSSS = $1;
          }
           if($l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/){
                $gRRR = $1;
          }
    }
     
        # trouve le champ nommé 'password'
        my $input1 = $form->find_input("txtAuthLoginUser")->value;
        my $input2 = $form->find_input("txtAuthLoginPassword")->value;
        my $input3 = $form->find_input('gPage')->value;
        my $input4 = $form->find_input("gMode")->value;
        my $input5 = $form->find_input("gType")->value;
        my $input6 = $form->find_input("gKey")->value;
        my $input7 = $form->find_input("gSSS")->value;
        my $input8 = $form->find_input("gRRR")->value;
        my $input9 = $form->find_input("hiddenDummyText")->value;
     
     
        #Affichage des variables
        print $input1. ' / '  .$input2.   ' / '   .$input3.  ' / '    .$input4.  ' / '   .$input5. ' / '  .$input6.   ' / '   .$input7.  ' / '    .$input8.  ' / ' .$input9;
    j'ai changé $page par @page.

    j'obitens les valeurs suivnates par rapport a mes input:

    login / pass / top / auth / / / / / dummy
    donc les champs vides pour gSSS et gRRR
    .

    pourtant lorsque j'affiche @page je vois bien mes champs remplis.

    Utiliser html:parser pourrait marcher ou pas?

  9. #9
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    Fais la modif suivante et regarde ce qu'il affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     foreach my $l (@page){
          if($l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/){
                $gSSS = $1;
                print $l."\n".$gSSS;
          }
           if($l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/){
                $gRRR = $1;
                print $l."\n".$gRRR;
          }
    }
    et un
    te renvoit quoi ?

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    @page me renvoie le formulaire remplit extrait :

    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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf8" />
    <meta http-equiv="pragma" content="no-cache" />
    <meta name="Author" content="BUFFALO INC." />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <link rel="stylesheet" href="/cgi-bin/html/en/style/styl.css?param=2002112" type="text/css" />
    <script type="text/javascript" src="/cgi-bin/html/en/script/prototype.js?param=20087112"></script>
    <script type="text/javascript" src="/cgi-bin/html/en/script/common.js?param=2008711"></script>
    <title>LinkStation - LS </title>
    </head>
    <!--body-->
    <body>
    <form id="XXX" name="XXXX" method="post" action="/cgi-bin/top.cgi">
    vers la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <input type="hidden" id="gPage" name="gPage" value="top" /><input type="hidden" id="gMode" name="gMode" value="" /><input type="hidden" id="gType" name="gType" value="auth" /><input type="hidden" id="gKey"  name="gKey"  value="" /><input type="hidden" id="gSSS"  name="gSSS"  value="cfe076457XXXXXX988e4d923" /><input type="hidden" id="gRRR"  name="gRRR"  value="41687XXXX683" />
     
    <div id="divDummyForm" style="display:none;">
    Ton code me renvoi bien les 2 valeurs si je commentee l'un des deux. si les deux font un "print" juste le dernier gRRR est renvoyé l'autre est surement ecrasé.

    Merci bcp de ton aide.

  11. #11
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    Tes inputs sont tous sur la même ligne dans @page ?
    Cela peut expliquer pourquoi tu ne récupère qu'une des deux valeurs....

    Si tel est le cas, (tous tes input sur une même ligne) essaye alors ceci plutôt :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach my $l (@page){
          if($l =~ /\<input type/){
                $gSSS = $l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/);
                $gRRR = $l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/);
                print $l."\n".$gSSS."\n".$gRRR;        
          }
    }

  12. #12
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    oui tous sur la même ligne.

    message d'error lors de lexecution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    syntax error at script_test.pl line 47, near "/name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/)"
    syntax error at script_test.pl line 48, near "/name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/)"
    Execution of script_test.pl aborted due to compilation errors.
    .

    ???

  13. #13
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    L'erreur vient des parenthèses en fin de ligne : tu peux les enlever et ca devrait passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach my $l (@page){
          if($l =~ /\<input type/){
                $gSSS = $l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                $gRRR = $l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                print $l."\n".$gSSS."\n".$gRRR;        
          }
    }

  14. #14
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Merci Beniou, plus l'erreur mais cela me renvoi le chiffre "1" pour chaque valeur???

  15. #15
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    En effet je viens de le tester et ca me renvoi 1 aussi... un truc m'échappe car normalement la variable devrait prendre la bonne valeur, à moins que j'oublie quelque chose....

    Quoi qu'il en soit, cette version marchera, je viens de la tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach my $p (@page){
          if($p =~ /\<input type/){
                $p =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                $gSSS = $1;
                $p =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                $gRRR = $1;
                print $p."\n".$gSSS."\n".$gRRR;        
          }
    }
    PS : pour l'erreur de parenthèse du dessus elle vient du copié-coller par rapport au if d'avant... erreur bête
    Edit : je viens de changer les $l en $p pour ne pas confondre les " l " et les " 1 "
    Edit 2 : si quelqun voit pourquoi la boucle du precedent message prend la valeur 1 au lieu de celle de $1....

  16. #16
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    C'est normal quand tu fais par exemple avec $gSSS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $gSSS = $l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
    ta variable $gSSS contient non pas le contenu de la variable match $1 mais la valeur vraie si jamais l'expression régulière a bien été trouvée dans ta chaîne

  17. #17
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    Ah voila, me disais bien aussi au'on pouvait le faire ! mais il manquait les parenthèses...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach my $l (@page){
          if($l =~ /\<input type/){
                ($gSSS) = $l =~ /name\=\"gSSS\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                ($gRRR) = $l =~ /name\=\"gRRR\"[ ]*value\=\"([a-zA-Z0-9]*)\"/;
                print $l."\n".$gSSS."\n".$gRRR;        
          }
    }
    Car en effet sans les parenthèses ca correspond au booléen... Merci Beniou pour le rappel, j'oublierais pu.

    pour newbies456, je te conseil cette dernière version, Esthétiquement plus jolie que la précedente.

  18. #18
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Merci a vous deux, je recupere bien mes deux champs.

    Now, il faut que je m'attaque a la parte reboot.

  19. #19
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Ne pas mettre les parenthèses à gauche de l'opérateur d'affectation, c'est définir un contexte de scalaire à cet opérateur, et par conséquent également à l'opérateur de rechercher de motif, qui retournera alors un booléen.
    Définir une liste à gauche de l'opérateur d'affectation fourni un contexte de liste à l'opérateur de recherche de motif, qui retournera alors les éléments capturés.
    La technique est plus esthétique, mais surtout, elle permet d'éviter l'usage des variables à effet de bord $1, $2, $3...

    Il existe une troisième manière de traiter le résultat d'une recherche de motif, en utilisant un pseudo opérateur, nommé gotcha, qui permet de récupérer dans un scalaire, le nombre d'occurrences d'élément matchés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb = () = $text =~ /(.)/g; # équivalent à length($text)
    Cette technique utilise le retour de l'opérateur d'affectation, qui est en fait le nombre d'élément de la liste à droite de l'opérateur. On affecte donc à la liste vide (ce qui équivaut à mettre dans le ramasse-miette sans les utiliser) l'ensemble des éléments trouvés, et le résultat de cette affectation, qui correspond au nombre d'élément, est affecté à $nb.

  20. #20
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Par défaut
    merci Philou pour les précisions ! Je vais encore me coucher moins bête !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. perl probleme affichage avec HTML
    Par Pierrot2612 dans le forum Langage
    Réponses: 4
    Dernier message: 02/12/2007, 16h23
  2. Réponses: 1
    Dernier message: 26/04/2007, 20h51
  3. [Sécurité] Script PHP pour valider du HTML
    Par marcha dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2005, 14h57
  4. Utilisation de HTML::Parser
    Par mobscene dans le forum Web
    Réponses: 6
    Dernier message: 27/10/2005, 13h57
  5. execution php dans perl
    Par rdams dans le forum Web
    Réponses: 7
    Dernier message: 11/10/2005, 20h09

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