Commencer la recherche au rang 'n' de la chaine

Commencer la recherche au rang 'n' de la chaine - PHP - Programmation

Marsh Posté le 18-04-2008 à 10:04:37    

Bonjour,
pour le sujet de mon stage je dois récupérer la fin d'une chaine.
 j'avais fait :  

Code :
  1. $new_result = substr($result,11,strlen($result ));


il s'agit en fait d'une chaine de type :
17.4.3.1.1.0.31.91.233.220.142  
 
ou je dois récupérer cette partie :  
 
0.31.91.233.220.142  
 
pour apres la rechercher dans :  
 
17.4.3.1.2.0.31.91.233.220.142
 
Donc j'avais penser à supprimer le début a partir du 11e caractere puis rajouter un prefixe...  
 
mais le probleme c'est que il s'agit d'une adresse de MIB( en réseau), donc ce script fonctionne parfaitement chez moi mais sur un autre pc ,
17.4.3.1.1.0.31.91.233.220.142  
s'affiche en fait comme ceci
iso.4.3.1.1.0.31.91.233.220.142  
donc le 11e caractere n'est plus le meme ,
 
c'est pourquoi je voudrais selectionner les 6 derniers champs puis rechercher dans le 2e tableau une chaine se finissant par la meme partie.
 
voila la partie de code qui correspond a ce que je fais actuellement :
 

Code :
  1. //recherche dans le tableau 1
  2. $result = array_search($hex, $array1);
  3. // on retire les 11 premiers caractères de la chaine
  4. $new_result = substr($result,11,strlen($result ));
  5. // on y ajoute un autre prefixe
  6. $bridge = substr_replace($new_result, '17.4.3.1.2.', 0, 0) ;
  7. //recherche du n° de bridge dans le tableau 2
  8. $result_bridge = $array2[$bridge];


 
merci beaucoup pour votre aide


Message édité par elmarokinho le 18-04-2008 à 14:27:23
Reply

Marsh Posté le 18-04-2008 à 10:04:37   

Reply

Marsh Posté le 18-04-2008 à 10:23:59    

ok merci sa marche !  
maintenant pour rechercher cette chaine dans le deuxieme tableau ?
je sais que pour préciser la fin d'une chaine c'est '$' mais si je recherche '$bridge$' (se finissant par la variabble bridge cela ne veut pas marché.  En recherchant directement de cette maniere cela m'éviterait d'avoir a remplacer le début de la chaine qui change selon les pc et donc éviter les errreurs.  
 
merci beaucoup

Reply

Marsh Posté le 18-04-2008 à 10:37:57    

en fait le but de la manip c'est de récupérer le port d'un switch depuis l'adresse mac d'un pc.
 
on a 4 array de type :
 

Citation :

[17.4.3.1.1.0.8.116.52.141.38] => Hex: 00 08 XX XX XX XX
 
[17.4.3.1.2.0.8.116.52.141.38] => 14
 
[17.1.4.1.2.14] => 14
 
[ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.14] => Fa0/14


 
On part de l'adresse Mac pour arrivé a Fa0/xx ...  
 
une  fois que j'ai extrait la fin de la premiere ligne je dois le chercher dans le 2e tableau pour avoir l'index 14 que je rechercherait a la fin du 3e tableau etc ...
 
voila j'espere que c'est plus clair
 
 
sinon j'ai pensé a sa :  

Code :
  1. foreach($array2 as $cle => $element)
  2. {
  3. $ary_orig = explode('.', $cle); //parcours les clés
  4. $ary_dest = array_slice($ary_orig, -6); //garde les 6 derniers groupes séparés par des points
  5. $new_result2 = join('.', $ary_dest);
  6. //a partir de la c'est nimporte quoi  
  7. $result_bridge = $array2[$new_result2];
  8. echo $result_bridge ;
  9.  
  10. }


 
lool ... en fait je réduit la clé du tableau au 6 derniers champs et je recherche dans ce nouveau tableau mais sa ne marche pas !


Message édité par elmarokinho le 18-04-2008 à 15:08:32
Reply

Marsh Posté le 18-04-2008 à 18:10:57    

Salut,
 
Si je comprends bien, tu pars de [17.4.3.1.1.0.8.116.52.141.38] pour arriver Fa0/14
 

Code :
  1. function getSwitchPort($sAddress, $aTab1, $aTab2, $aTab3) {
  2.     $aAddress = explode('.', $sAddress);
  3.     return $aTab3['ifMIB.ifMIBObjects.ifXTable.ifXEntry.ifName.' . $aTab2['17.1.4.1.2.' . $aTab1['17.4.3.1.1.' . join('.', array_slice($aAddress, -6))]];
  4. }
  5. foreach ($array2 as $sKey => $sValue) {
  6.   echo getSwitchPort($sKey, $aTab1, $aTab2, $aTab3);


 
A toi d'adapter le code si par exemple les tableaux changent ou si le préfixe des clés des tableaux changent

Reply

Marsh Posté le 23-04-2008 à 14:59:41    

la derniere solution n'est pas envisageable car les prefixe changent selon la config du pc...

 

j'ai une fonction :

Code :
  1. function array_s($array, $key_pattern) {
  2.        foreach ($array as $key => $value) {
  3.          if (preg_match($key_pattern, $key)) {
  4.            return $value;
  5.          }
  6.        }
  7.    $error = 'erreur d execution' ;
  8.        return $error;
  9.       }
 

qui marche très bien dans la plupart des cas ...

 

mais si je recherche

 
Code :
  1. [.iso.3.6.1.2.1.3.1.1.2.54.1.192.168.0.2] => Hex: FF FF FF FF FF
 

Hex : FF FF FF FF FF a partir de 192.168.0.2

 

cela ne marche pas.. pourquoi?


Message édité par elmarokinho le 23-04-2008 à 15:00:11
Reply

Marsh Posté le 23-04-2008 à 15:11:08    

Euh...
 
Tu peux nous détailler ce qu'il y a dans $array et $key_pattern ?

Reply

Marsh Posté le 23-04-2008 à 15:25:20    

Melendril a écrit :

Euh...
 
Tu peux nous détailler ce qu'il y a dans $array et $key_pattern ?


 
j'utilise la fonction comme ceci ( ailleurs sa marche )  :

Code :
  1. $hex = array_s($array5, '/' . $ip_machine . '$/');


 
une ligne de $array5 :  
 

Code :
  1. [.iso.3.6.1.2.1.3.1.1.2.54.1.192.168.0.2] => Hex: FF FF FF FF FF


 
et  

Code :
  1. $ip_machine = "192.168.0.2" :


 
par exemple ...  
 
mais c'est vraiment bizarre car l'adresse mac qui est le résultat de cette recherche est utilisée dans la suite du script et ça marche, mais si je veu l'afficher je ne peut pas ...  :??:  
 
si tu as une idée...

Reply

Marsh Posté le 23-04-2008 à 15:47:49    

elmarokinho a écrit :

dans la suite du script et ça marche, mais si je veu l'afficher je ne peut pas ...  :??:

??
montre nous un peu plus de code
 
PS: attention, dans ta regexp tu devrais faire :

Code :
  1. $key_pattern = str_replace('.', '\.', $key_pattern);


Reply

Marsh Posté le 23-04-2008 à 15:54:15    

Si tes crochets font partie de la clé du tableau, forcément elle ne se finit pas par l'ip, mais par l'ip puis un crochet. :spamafote:


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-04-2008 à 15:55:08    

Regarde  :
 

Code :
  1. //Recherche de l'addresse MAc
  2. $hex = array_s($array5, '/' .$ip_machine. '$/');
  3. echo $ip_machine;
  4. echo "          " ;
  5. echo $hex;
  6. // Supression du prefixe 'Hex'  
  7. $mac = substr($hex, 4);
  8. //recherche dans le tableau 1
  9. $result = array_search($hex, $array1);
  10. //On garde les 6 derniers champs
  11. $ary_orig = explode('.', $result);
  12. $ary_dest = array_slice($ary_orig, -6);
  13. $new_result = join('.', $ary_dest);
  14. // recherche du nom du switch
  15. $name_index = ".0" ;
  16. $name = array_s($array0, '/' . $name_index . '$/');
  17. // recherche bridge    
  18. $result_bridge = array_s($array2, '/' . $new_result . '$/');
  19. // recherche index
  20. $result_index = array_s($array3, '/' . $result_bridge . '$/');
  21. // recherche port
  22. $result_port = array_s($array4, '/' . $result_index . '$/');


 
Je ne peux pas afficher $mac mais le reste s'exectue kan meme en utilisant le resultat ...
 
 
 
Si je copie la fonction seule dans un nouveau programme en mettant :  
$ip_machine = "132.xxx.17.216";
 -----fonction ----
echo $ip_machine;
echo $hex;
 
j'obtient :

Citation :

132.xxx.17.216 Hex: 00 1A xx xx xx xx


 
Si je garde  
$ip_machine = $_GET['ip_machine'];
 
et que je fais la MEME chose  
 
j'ai :  

Citation :

132.xxx.17.216 erreur d execution


 
 
bizarre nan ?

Reply

Marsh Posté le 23-04-2008 à 15:55:08   

Reply

Marsh Posté le 23-04-2008 à 15:56:20    

sielfried a écrit :

Si tes crochets font partie de la clé du tableau, forcément elle ne se finit pas par l'ip, mais par l'ip puis un crochet. :spamafote:

 


non il ne font pas partie de la clé c'est pour l'affichage ... tkt j'ai essayé aussi en rajoutant un crochet ;-)


Message édité par elmarokinho le 23-04-2008 à 15:56:39
Reply

Marsh Posté le 23-04-2008 à 15:58:10    

soju a écrit :

dans ta regexp tu devrais faire :

Code :
  1. $key_pattern = str_replace('.', '\.', $key_pattern);




Et pour ça , je vais testé mais ça ne change rien parce que les autre variables avec lesquelles sa marche comportent également des points... mais je vérifie on sais jamais.

 

[edit] encore la meme erreur

Message cité 1 fois
Message édité par elmarokinho le 23-04-2008 à 16:00:16
Reply

Marsh Posté le 23-04-2008 à 16:17:40    

elmarokinho a écrit :

Si je garde  
$ip_machine = $_GET['ip_machine'];
et que je fais la MEME chose

si tu ne changes que cette ligne, il y a forcément un problème dans ta variable get...
ptet un espace en trop ? essaye avec trim($_GET['ip_machine']);
 

elmarokinho a écrit :

Et pour ça , je vais testé mais ça ne change rien

si, ton code est plus propre vu que dans une regexp le . signifie n'importe quel caractère

Reply

Marsh Posté le 23-04-2008 à 16:19:34    

elmarokinho a écrit :

Je ne peux pas afficher $mac mais le reste s'exectue kan meme en utilisant le resultat ...

je ne vois pas l'endroit ou tu essayes d'afficher $mac...
et c'est normal que le reste s'exécute vu que tu ne testes pas la valeur de retour de array_s

Reply

Marsh Posté le 23-04-2008 à 16:21:33    

soju a écrit :

je ne vois pas l'endroit ou tu essayes d'afficher $mac...
et c'est normal que le reste s'exécute vu que tu ne testes pas la valeur de retour de array_s


 
Ligne 7 $hex est composé de la fin de $mac ...
puis $hex est utitilisé par la suite ...
 

Reply

Marsh Posté le 23-04-2008 à 16:22:50    

elmarokinho a écrit :

Ligne 7 $hex est composé de la fin de $mac ...

non, c'est l'inverse

Reply

Marsh Posté le 23-04-2008 à 16:27:45    

soju a écrit :

non, c'est l'inverse


 
oui dsl .. dans la précipitation on dit nimporte koi  :jap:

Reply

Marsh Posté le 23-04-2008 à 16:32:56    

Bizare ,

 

en remplaçant :

Code :
  1. <input type="text" name="ip_machine" value="<?php echo "$ip_machine"; ?>" /></br>
 

par :

 
Code :
  1. <input type="text" name="ip_machine" value="" />  </br>
 

Cela remarche ... pourquoi? je ne sais pas !
avec value="<?php echo $ip_machine; ?>" sa marche également ;-)


Message édité par elmarokinho le 23-04-2008 à 16:37:50
Reply

Marsh Posté le 23-04-2008 à 17:09:07    

En même temps : <?php echo "$ip_machine"; ?> c'est pas correcte du tout, on ne met jamais une variable entre des guillemets.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed