Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/07/2007, 16h27   #1
Membre habitué
 
Inscription : juin 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 137
Points : 26
Points : 26
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 :
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 :
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
liverbird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2007, 17h39   #2
Membre habitué
 
Inscription : juin 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 137
Points : 26
Points : 26
j'ai essayé d'utiliser preg_match comme ceci
Code :
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...
liverbird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2007, 17h43   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Une expression régulière pour capturer ces deux informations :
Code :
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
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2007, 17h53   #4
Membre habitué
 
Inscription : juin 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 137
Points : 26
Points : 26
Merci
Citation:
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
liverbird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 12h35   #5
Membre habitué
 
Inscription : juin 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 137
Points : 26
Points : 26
Citation:
Code :
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 :
Citation:
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
liverbird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 13h49   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
if (preg_match('~Ad-hoc network detected:.*\bSSID ([^,]+?).*RSSI (\d+?)~Ui', $v, $m)) {
?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 14h49   #7
Membre habitué
 
Inscription : juin 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 137
Points : 26
Points : 26
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 :
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
liverbird est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2007, 12h01   #8
Nouveau Membre du Club
 
Inscription : juillet 2007
Messages : 34
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 34
Points : 37
Points : 37
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 :
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
hindous est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h25.


 
 
 
 
Partenaires

Hébergement Web