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 :

extraire une chaine


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 78
    Points : 41
    Points
    41
    Par défaut extraire une chaine
    Bonjour a tous,

    Je viens vers vous car je débute en perl et je n'arrive pas à résoudre mon problème..
    J'ai une chaine :

    [<HTML><HEAD><META URL=https://196.214.79.38"/></HEAD><BODY> Click here </BODY></HTML>]

    et je voudrais pouvoir récupérer mon adresse IP uniquement.J'ai bien vu que les regex était super efficace en perl mais je n'arrive pas encore à bien les manier.

    Merci,
    A+

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    par rapport à ta chaine initiale, j'ai du rajouter un backslash devant le guillemet (après le 38)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/local/bin/perl
    use strict;
    use warnings;
     
     
    print("Salut Larry\n\n");
     
    my $chaine = "[<HTML><HEAD><META URL=https://196.214.79.38\"/></HEAD><BODY> Click here </BODY></HTML>]";
     
     if( $chaine =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ ){
    	print "IP :: $1\n";
    }
    les parenthèses permettent de récupérer l'ip si elle existe et de valoriser la variable interne perl $1.

    cette regex recherche une sous chaine composée de 1 à 3 décimales (entre 0 et 9), soit 4, ou bien 45 ou encore 859 (pour l'exemple) suivi d'un point.
    cette recherche est répété 4 fois dans la regex pour correspondre au format d'une ip. La recherche du point ne se fait que 3 fois, of course.

    Je te conseille de lire la page suivante : http://lhullier.developpez.com/tutor...l/intro/#Lno-I

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    pour avoir l'adresse en entier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if( $chaine =~ m/META URL="([^"])"\/>/{
    	print "IP :: $1\n";
    }

  4. #4
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Je pense aussi que dans la chaine à matcher il manque le guillemet de début d'URL.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Merci a vous tous

    Malheureusement je n'ai pas oublié de " et je ne peux pas rajouter de \ après mon IP a la chaine que je récupère :/

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Mais la solution de JeanMi marche parfaitement ..

    Merci beaucoup pour l'aide, les regex et moi ca fait 2 (pour l'instant)

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par ifr38 Voir le message
    Mais la solution de JeanMi marche parfaitement ..

    Merci beaucoup pour l'aide, les regex et moi ca fait 2 (pour l'instant)
    si tu n'a pas le " au début tu l'enlève de la regex et le \ et juste pour que la regex considère le / comme un caractère à matcher
    je pense que si tu enlèves le " dans ma regex ça marche aussi

    Le seul problème avec la regex de @JeanMi3000, c'est qu'il ne prend pas l'adresse complète (tu n'en as peut être pas besoin) mais surtout si tu as une une URL qui n'a pas la forme 127.0.0.1 (ex: DNS) tu ne la récupéreras pas

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    J'ajoute que, même si c'est faisable et simple de récupérer une adresse IP, il n'est généralement pas recommandé d'utiliser des expression régulières pour parser du HTML (ou du XML ou du Json, d'ailleurs). Pour un cas aussi simple, ça va, mais n'essaie pas d'en faire beaucoup plus avec des regex sur du HTML. Il y a des modules spécialisés pour parser le HTML.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par ifr38 Voir le message
    Merci a vous tous

    Malheureusement je n'ai pas oublié de " et je ne peux pas rajouter de \ après mon IP a la chaine que je récupère :/
    Il n'y a de problème de guillemets que lorsque insère directement le string dans le script perl (pour des test par exemple ).
    si le string provient d'un fichier externe on a pas de guillemets à echapper

    sinon comme disait Monsieur Lolo, use HTML::SimpleLinkExtor marche très bien.

  10. #10
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Concernant les guillemets, la chaine à parser étant :

    <HTML><HEAD><META URL=https://196.214.79.38"/></HEAD><BODY> Click here </BODY></HTML>

    (voir 1er message)

    je persiste en indiquant qu'il manque une guillemet après "URL=" pour que la chaine soit HTML valid, et donc, puisse être correctement analysée par un parser HTML.

    Maintenant, si la chaine est

    <HTML><HEAD><META URL="https://196.214.79.38"/></HEAD><BODY> Click here </BODY></HTML>

    pas de soucis bien sûr (mais ifr38 semblait dire que malheureusement, il ne manquait pas de guillemet, laissant entendre que la chaine récupérée n'est pas HTML valid)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    a propos de guillemets et d'échappements.
    Je suis entrain d'écrire du code qui sert à écrire du code. C'est la première fois que je fais ça et je trouve que c'est la croix et la bannière justement en ce qui concerne les échappements de guillemets, les échappements d'échappements d'échappements, etc ...

  12. #12
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Connais tu la fonction quotemeta ?
    Un petit perldoc -f quotemeta t'aidera sans doute
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Philou67430 Voir le message

    pas de soucis bien sûr (mais ifr38 semblait dire que malheureusement, il ne manquait pas de guillemet, laissant entendre que la chaine récupérée n'est pas HTML valid)
    effectivement, je recupere le code HTML (dont je ne suis pas l'auteur) tel quel.. il est possible qu'il ne soit pas "valid" mais cela m'importe peu puisqu'uniquement l'adresse IP m'interesse

  14. #14
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Si tu veux mettre en œuvre les méthodes proposées à l'aide d'un parser HTML, cette précision a toute son importance au contraire.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Connais tu la fonction quotemeta ?
    Un petit perldoc -f quotemeta t'aidera sans doute
    merci, je connaissais pas..
    par contre ça m'aide pas des masses après un rapide premier essai
    car si pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    perl -e ' print quotemeta "hell o"'
    hell\ o~:
    j'ai bien un échappement d'espace, c'est bien tout ce j'arrive à faire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    perl -e ' print quotemeta "hell'o"'
    >
    j'ai une invite à laquelle je ne sais répondre. Mais peut être que je m'y prend mal.

  16. #16
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    J'ai l'impression que Philou voulait parler des expressions "quote and quote-like" : q(), qq(), qw(), etc. Sachant que les paires de parenthèses peuvent être remplacées par des crochets, des accolades, etc.

    Il y a aussi les "heredocs".

  17. #17
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Non, je voulais bien parler de la fonction d'échappement quotemeta (mais j'ai peut-être mal compris la question initiale).
    En revanche, si tu veux créer des chaines littérales contenant des guillemets, il faut naturellement éviter d'utiliser des guillemets, et plutôt les opérateurs q() et qq() introduit par lolo.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 124
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    (mais j'ai peut-être mal compris la question initiale).
    .
    pour reprendre l'exemple déja donné
    si je veux obtenir ceci dans un fichier.pl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system "LC_CTYPE=C sed '/^'_dn__idcc_02_12_03_'/d' /Users/mac/commentaires.txt > tmp && mv -f tmp /Users/mac/commentaires.txt";
    il faut pour écrire ce premier, que dans l'autre script pl j'écrive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $system = 'system "LC_CTYPE=C sed \'/^\''."$search".'\'/d\' '."$fichcom".' > tmp && mv -f tmp '."$fichcom".'";';
    say $in $system;
    et là c'est simple. J'imagine même pas avec une regex compliquée.
    un cauchemar certainement.

  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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Donc effectivement c'est ce dont parlais lolo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $system = qq(system "LC_CTYPE=C sed /^$search/d $fichcom > tmp && mv -f tmp $fichcom");
    Attention cependant au contenu de $seach pour lequel il faudra peut-être appeler "quotemeta" afin de s'assurer que les caractères spéciaux de regexp soient échappés.

    Cela dit, appeler sed avec system en perl me semble contre nature (en plus d'être non portable).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. Extraire une chaine contenue entre 2 delimiteurs
    Par gregb34 dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2006, 09h21
  2. Extraire une chaine
    Par had182 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/01/2006, 19h24
  3. Extraire une chaine de caratere
    Par matthieu5978 dans le forum Langage
    Réponses: 2
    Dernier message: 15/12/2005, 20h52
  4. [RegEx] Extraire une chaine
    Par pierre50 dans le forum Langage
    Réponses: 8
    Dernier message: 15/09/2005, 13h43
  5. Réponses: 2
    Dernier message: 10/07/2002, 12h51

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