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 :

Extraire un entier ou un mot dans une chaine [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Points : 58
    Points
    58
    Par défaut Extraire un entier ou un mot dans une chaine
    Bonjour
    J'ai un programme php qui m'affiche des traps snmp dans un fichier à chaque fois que ma machine en reçoit une.
    Je veux extraire des informations de ces traps en particulier le SSID et le RSSI.
    voiçi un exemple de traps reçu, j'ai mis le SSID et le RSSI en gras :

    New trap received : 31-07-2007 - 16:15
    Host : 192.168.X.X
    Ip : UDP: [192.168.X.X]:1029
    TRAP: SNMPv2-SMI::zeroDotZero.0 "802.11g: Ad-hoc network detected: BSSID 00-13-02-cd-83-56, SSID test_zak, channel 11 (2462 MHz), RSSI 36"

    et voilà mon programme :
    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
    function ask($prompt = '') {
     
        if (!empty($prompt)) {
            fwrite(STDOUT, $prompt);
        }
        return trim(fgets(STDIN));
    }
     
     //On met les donées de la trap dans un tableau
     
    $host = ask('Host : ');
    $ip = ask('Ip : ');
    $vars = array();
    while (!feof(STDIN)) {
        array_push($vars, trim(fgets(STDIN)));
    }
     
    // On ouvre le fichier "affichetraps" en écriture seulement avec ajout du contenu à la fin
     
    $fp = fopen(TRAP_FILE, 'a');
     
    $date = date("d-m-Y");
    $heure = date("H:i");
     
    // parcourir le tableau et stocker le contenu dans la variable $v
     
    foreach ($vars as $v) {
     
    //afficher le contenu des traps qui concernent la détéction d'ad hoc seulement
     
        if (ereg('Ad-hoc network detected',$v)) {
    	fwrite($fp, 'New trap received : '.$date . " - " . $heure . PHP_EOL);
    	fwrite($fp, 'Host : '.$host . PHP_EOL);
    	fwrite($fp, 'Ip : '.$ip . PHP_EOL);
            fwrite($fp, 'TRAP: ' . $v . PHP_EOL);
    	fwrite($fp, PHP_EOL . '----------' . PHP_EOL);
        }
    }
     
    fclose($fp);
    Je ne sais pas qu'elle fonction utiliser...
    j'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $i = RSSI;	
    	$rssi = strrchr($v, $i);
    	echo "$rssi";
    mais ça me donne

    RSSI 36"

    mais moi je ne veux afficher juste que le nombre dans la variable.

    voilà j'espère que quelqu'un a une idée
    Merci
    Cordialement

  2. #2
    Membre du Club
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Points : 58
    Points
    58
    Par défaut
    j'ai essayé d'utiliser preg_match comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match('/[0-9]{1,2}/',$v,$result ,PREG_OFFSET_CAPTURE,3); 
    	print $result[0][0] ;
    mais ça m'affiche 2
    le RSSI est un entier qui se compose de 1 ou 2 chiffres c'est pour ça que j'ai utilisé
    [0-9]{1,2}
    mais je ne comprend pas vraiment le résultat...

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Une expression régulière pour capturer ces deux informations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       if (preg_match('~Ad-hoc network detected:.*SSID ([^\s,]+?).*RSSI (\d+?)~Ui', $v, $m)) {
            fwrite($fp, 'SSID : ' . $m[1] . PHP_EOL);
            fwrite($fp, 'RSSI : ' . $m[2] . PHP_EOL);
    	fwrite($fp, 'New trap received : '.$date . " - " . $heure . PHP_EOL);
    	fwrite($fp, 'Host : '.$host . PHP_EOL);
    	fwrite($fp, 'Ip : '.$ip . PHP_EOL);
            fwrite($fp, 'TRAP: ' . $v . PHP_EOL);
    	fwrite($fp, PHP_EOL . '----------' . PHP_EOL);
       }


    Vous utilisez le résultat de preg_match comme celui de la fonction preg_match_all alors que le tableau résultant n'est pas multi-dimensionnel. De plus votre 2 doit être celui de SNMPv2

  4. #4
    Membre du Club
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Points : 58
    Points
    58
    Par défaut
    Merci
    De plus votre 2 doit être celui de SNMPv2
    il faut dire que j'étais préssé de l'afficher ce RSSI
    je vais regarder tout ça de plus près
    Merci encore

  5. #5
    Membre du Club
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Points : 58
    Points
    58
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('~Ad-hoc network detected:.*SSID ([^\s,]+?).*RSSI (\d+?)~Ui', $v, $m))
    merci ça marche
    il y a juste un petit truc, le résultat me renvoie la valeur du BSSID au lieu du SSID sachant que ma chaine s'écrit :
    TRAP: SNMPv2-SMI::zeroDotZero.0 "802.11g: Ad-hoc network detected: BSSID 00-13-02-72-5f-ff, SSID wireless pku, channel 11 (2462 MHz), RSSI 2"
    comme BSSID contient une sous chaine SSID donc il m'affiche celle là et il ne va pas jusqu'au vrai SSID que je veux

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par zakalova
    il y a juste un petit truc, le résultat me renvoie la valeur du BSSID au lieu du SSID
    Oups, je n'y avais pas prêté attention, l'ajout d'un délimiteur de mot (\b) devrait résoudre de manière fort simple le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (preg_match('~Ad-hoc network detected:.*\bSSID ([^,]+?).*RSSI (\d+?)~Ui', $v, $m)) {
    ?

  7. #7
    Membre du Club
    Profil pro
    Ingénieur Développement
    Inscrit en
    Juin 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Développement

    Informations forums :
    Inscription : Juin 2006
    Messages : 140
    Points : 58
    Points
    58
    Par défaut
    yes ça marche avec le \b
    du coup je me suis carrement débarassé de la ligne affichant toute la trap et j'ai gardé juste les détails :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (preg_match('~Ad-hoc network detected:.*BSSID ([^\s,]+?).*\bSSID ([^,]+?).*RSSI (\d+?)~Ui', $v, $m)) {	
    	fwrite($fp, 'New trap received : '."Ad-hoc network detected : ".$date . " - " . $heure . PHP_EOL);
    	fwrite($fp, 'Host : '.$host . PHP_EOL);
    	fwrite($fp, 'Ip : '.$ip . PHP_EOL);
            //fwrite($fp, 'TRAP: ' . $v . PHP_EOL);
    	fwrite($fp, 'BSSID : ' . $m[1] . PHP_EOL);
            fwrite($fp, 'SSID : ' . $m[2] . PHP_EOL);
    	fwrite($fp, 'RSSI : ' . $m[3] . PHP_EOL);
    	fwrite($fp, PHP_EOL . '----------' . PHP_EOL);
    }
    et ça m'affiche bien

    New trap received : Ad-hoc network detected : 01-08-2007 - 14:42
    Host : 192.168.X.X
    Ip : UDP: [192.168.X.X]:1029
    BSSID : X-X-X-X-X-X
    SSID : test_zak
    RSSI : 41


    merci encore
    à bientôt

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 34
    Points : 41
    Points
    41
    Par défaut hindous
    Citation Envoyé par julp
    Oups, je n'y avais pas prêté attention, l'ajout d'un délimiteur de mot (\b) devrait résoudre de manière fort simple le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (preg_match('~Ad-hoc network detected:.*\bSSID ([^,]+?).*RSSI (\d+?)~Ui', $v, $m)) {
    ?

    bonjour ,

    tu veux bien me dire pourquoi ça m'affiche : UNKNWON HOST
    la trap reçu :
    Trap received : jeu aoû 2 11:19:01 CEST 2007 from
    $HOST:<UNKNOWN>: IF-MIB::linkUp
    Host: <UNKNOWN> (UDP: [127.0.0.1]:33170)
    DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:34:00.13
    SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkUp
    SNMPv2-MIB::snmpTrapEnterprise.0 NET-SNMP-MIB::netSnmpAgentOIDs.10


    NB: mon script est en perl
    si tu peux m'aider n'hesites pas !
    merci

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Recherche un mot dans une chaine de caractere
    Par jean tof dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2006, 11h34
  3. extraire le nom d'un fichier dans une chaine sauf le car -
    Par digger dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 13/12/2005, 00h02
  4. [Regex]Recherche de mots dans une chaîne
    Par lionel69 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 17/11/2005, 18h20

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