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 PHP Discussion :

[Regex] Capturer du texte pour l'interpreter


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [Regex] Capturer du texte pour l'interpreter
    Bonjour,

    Pour un projet, j'ai créer une application web qui récupère les informations de commutateurs (switch) et je les interprète dans mon interface.

    Je reçois donc un pavé de texte, que je peaufine avec les regex.


    Voici mon texte reçu par le commutateur :

    Switch#show interfaces status Port Name Status Vlan Duplex Speed Type Fa0/1 connected 1 a-full a-100 10/100BaseTX Fa0/2 notconnect 1 auto auto 10/100BaseTX Fa0/3 notconnect 1 auto auto 10/100BaseTX Fa0/4 notconnect 1 auto auto 10/100BaseTX Fa0/5 notconnect 1 auto auto 10/100BaseTX Fa0/6 notconnect 1 auto auto 10/100BaseTX Fa0/7 notconnect 1 auto auto 10/100BaseTX Fa0/8 notconnect 1 auto auto 10/100BaseTX Fa0/9 notconnect 1 auto auto 10/100BaseTX Fa0/10 notconnect 1 auto auto 10/100BaseTX Fa0/11 notconnect 1 auto auto 10/100BaseTX Fa0/12 notconnect 1 auto auto 10/100BaseTX Fa0/13 notconnect 1 auto auto 10/100BaseTX Fa0/14 notconnect 1 auto auto 10/100BaseTX Fa0/15 notconnect 1 auto auto 10/100BaseTX Fa0/16 notconnect 1 auto auto 10/100BaseTX Fa0/17 notconnect 1 auto auto 10/100BaseTX Fa0/18 notconnect 1 auto auto 10/100BaseTX Fa0/19 notconnect 1 auto auto 10/100BaseTX Fa0/20 notconnect 1 auto auto 10/100BaseTX Fa0/21 notconnect 1 auto auto 10/100BaseTX Fa0/22 notconnect 1 auto auto 10/100BaseTX Fa0/23 notconnect 1 auto auto 10/100BaseTX Fa0/24 notconnect 1 auto auto 10/100BaseTX Gi0/1 notconnect 1 auto auto 10/100/1000BaseTX Gi0/2 notconnect 1 auto auto 10/100/1000BaseTX
    Voici mon expression régulière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     
    // expression régulière qui traite les informations
    preg_match_all('#^(?(?!Port|Switch)([^\s]+)|)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s*$#im', $reste, $donnees);
     
    ?>
    Voici le résultat :


    <?php

    Array
    (
    [0] => Array
    (
    [0] => Fa0/1 connected 1 a-full a-100 10/100BaseTX
    [1] => Fa0/2 notconnect 1 auto auto 10/100BaseTX
    [2] => Fa0/3 notconnect 1 auto auto 10/100BaseTX
    [3] => Fa0/4 notconnect 1 auto auto 10/100BaseTX
    [4] => Fa0/5 notconnect 1 auto auto 10/100BaseTX
    [5] => Fa0/6 notconnect 1 auto auto 10/100BaseTX
    [6] => Fa0/7 notconnect 1 auto auto 10/100BaseTX
    [7] => Fa0/8 notconnect 1 auto auto 10/100BaseTX
    [8] => Fa0/9 notconnect 1 auto auto 10/100BaseTX
    [9] => Fa0/10 notconnect 1 auto auto 10/100BaseTX
    [10] => Fa0/11 notconnect 1 auto auto 10/100BaseTX
    [11] => Fa0/12 notconnect 1 auto auto 10/100BaseTX
    [12] => Fa0/13 notconnect 1 auto auto 10/100BaseTX
    [13] => Fa0/14 notconnect 1 auto auto 10/100BaseTX
    [14] => Fa0/15 notconnect 1 auto auto 10/100BaseTX
    [15] => Fa0/16 notconnect 1 auto auto 10/100BaseTX
    [16] => Fa0/17 notconnect 1 auto auto 10/100BaseTX
    [17] => Fa0/18 notconnect 1 auto auto 10/100BaseTX
    [18] => Fa0/19 notconnect 1 auto auto 10/100BaseTX
    [19] => Fa0/20 notconnect 1 auto auto 10/100BaseTX
    [20] => Fa0/21 notconnect 1 auto auto 10/100BaseTX
    )

    [1] => Array
    (
    [0] => Fa0/1
    [1] => Fa0/2
    [2] => Fa0/3
    [3] => Fa0/4
    [4] => Fa0/5
    [5] => Fa0/6
    [6] => Fa0/7
    [7] => Fa0/8
    [8] => Fa0/9
    [9] => Fa0/10
    [10] => Fa0/11
    [11] => Fa0/12
    [12] => Fa0/13
    [13] => Fa0/14
    [14] => Fa0/15
    [15] => Fa0/16
    [16] => Fa0/17
    [17] => Fa0/18
    [18] => Fa0/19
    [19] => Fa0/20
    [20] => Fa0/21
    )

    [2] => Array
    (
    [0] => connected
    [1] => notconnect
    [2] => notconnect
    [3] => notconnect
    [4] => notconnect
    [5] => notconnect
    [6] => notconnect
    [7] => notconnect
    [8] => notconnect
    [9] => notconnect
    [10] => notconnect
    [11] => notconnect
    [12] => notconnect
    [13] => notconnect
    [14] => notconnect
    [15] => notconnect
    [16] => notconnect
    [17] => notconnect
    [18] => notconnect
    [19] => notconnect
    [20] => notconnect
    )

    [3] => Array
    (
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 1
    [6] => 1
    [7] => 1
    [8] => 1
    [9] => 1
    [10] => 1
    [11] => 1
    [12] => 1
    [13] => 1
    [14] => 1
    [15] => 1
    [16] => 1
    [17] => 1
    [18] => 1
    [19] => 1
    [20] => 1
    )

    [4] => Array
    (
    [0] => a-full
    [1] => auto
    [2] => auto
    [3] => auto
    [4] => auto
    [5] => auto
    [6] => auto
    [7] => auto
    [8] => auto
    [9] => auto
    [10] => auto
    [11] => auto
    [12] => auto
    [13] => auto
    [14] => auto
    [15] => auto
    [16] => auto
    [17] => auto
    [18] => auto
    [19] => auto
    [20] => auto
    )

    [5] => Array
    (
    [0] => a-100
    [1] => auto
    [2] => auto
    [3] => auto
    [4] => auto
    [5] => auto
    [6] => auto
    [7] => auto
    [8] => auto
    [9] => auto
    [10] => auto
    [11] => auto
    [12] => auto
    [13] => auto
    [14] => auto
    [15] => auto
    [16] => auto
    [17] => auto
    [18] => auto
    [19] => auto
    [20] => auto
    )

    [6] => Array
    (
    [0] => 10/100BaseTX
    [1] => 10/100BaseTX
    [2] => 10/100BaseTX
    [3] => 10/100BaseTX
    [4] => 10/100BaseTX
    [5] => 10/100BaseTX
    [6] => 10/100BaseTX
    [7] => 10/100BaseTX
    [8] => 10/100BaseTX
    [9] => 10/100BaseTX
    [10] => 10/100BaseTX
    [11] => 10/100BaseTX
    [12] => 10/100BaseTX
    [13] => 10/100BaseTX
    [14] => 10/100BaseTX
    [15] => 10/100BaseTX
    [16] => 10/100BaseTX
    [17] => 10/100BaseTX
    [18] => 10/100BaseTX
    [19] => 10/100BaseTX
    [20] => 10/100BaseTX
    )

    );

    ?>
    J'obtiens donc que les 21 ports, alors que je devrais en avoir 26 jusqu'au ports Gi (Gigabit Ethernet).

    Je ne sais pas d'ou cela peut venir car lorsque je test le pavé de texte directement dans une variable cela fonctionne.

    Par contre, lorsque je test en direct avec un commutateur, j'ai des mots en plus "-- More --" que je supprime, et j'obtiens ensuite que les 21 ports.

    Si quelqu'un peut m'aider, j'en serais très reconnaissant !

    Merci de votre aide

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    il envoie pas de saut de lignes ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse stealth35

    J'ai réalisé un nl2br en php sur le texte reçu avant et après traitrement.

    Avant traitement le texte brut avec nl2br :



    Après traitement le texte avec nl2br :



    Je traite donc le texte en supprimant les "-- More --", si tu vois une explication ?

    Merci de ton aide

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voici comment je traite mon texte reçu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
     
    // on nettoye le texte reçu
    $reste = substr($status, 99, strlen($status));
    $reste = str_replace('--More--', '', $reste);
    $reste = str_replace(chr(8), '', $reste);
     
    ?>
    Sur la première ligne, je supprime tout le texte inutile concernant l’authentification au début.
    Sur la deuxième ligne, je supprime les --More--.
    Et enfin sur la troisième ligne, je supprime les caractères spéciaux autour du --More--.

    Merci de votre aide

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai cherché et effectué plusieurs tests avec la regex, et désormais j'arrive à avoir soit les 21 ports, soit les 5 autres ports.

    Avec cette regex, j'obtiens les 21 premiers ports :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
     
    preg_match_all('#^(?(?!Port|Show)([^\s]+)|)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s*$#im', $reste, $donnees);
     
    ?>
    Avec cette regex, j'obtiens les 5 derniers ports :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
     
    preg_match_all('#^(?(?!Port|Show)\s+([^\s]+)|)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s*$#im', $reste, $donnees);
     
    ?>
    J'ai juste rajouté "\s+" au début de la seconde regex après "Show".

    Sais-tu si c'est possible de coupler ces deux regex pour n'en faire qu'une seule, et obtenir tous les ports ?

    Merci de ton aide

Discussions similaires

  1. Erreur sur champ text pour un index Full-Text
    Par Steph82 dans le forum Outils
    Réponses: 5
    Dernier message: 06/01/2011, 15h08
  2. [RegEx] Regex ou autre pour capture de texte ?
    Par oneTime dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2008, 19h46
  3. [Regex] Vérifier un texte avec accents
    Par supermanu dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 09/10/2005, 16h29
  4. débloquer les zones de textes pour modif
    Par seb59dk dans le forum IHM
    Réponses: 1
    Dernier message: 09/09/2005, 10h56
  5. différence entre varchar et text pour l'occupation mémoire
    Par champion dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/12/2004, 19h02

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