Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1953 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Commencer la recherche au rang 'n' de la chaine

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Commencer la recherche au rang 'n' de la chaine

n°1719645
elmarokinh​o
Posté le 18-04-2008 à 10:04:37  profilanswer
 

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
mood
Publicité
Posté le 18-04-2008 à 10:04:37  profilanswer
 

n°1719668
elmarokinh​o
Posté le 18-04-2008 à 10:23:59  profilanswer
 

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

n°1719690
elmarokinh​o
Posté le 18-04-2008 à 10:37:57  profilanswer
 

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
n°1720054
Melendril
Posté le 18-04-2008 à 18:10:57  profilanswer
 

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

n°1722867
elmarokinh​o
Posté le 23-04-2008 à 14:59:41  profilanswer
 

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
n°1722888
Melendril
Posté le 23-04-2008 à 15:11:08  profilanswer
 

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

n°1722904
elmarokinh​o
Posté le 23-04-2008 à 15:25:20  profilanswer
 

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...

n°1722924
soju
One shot !
Posté le 23-04-2008 à 15:47:49  profilanswer
 

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);


n°1722931
sielfried
Posté le 23-04-2008 à 15:54:15  profilanswer
 

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
n°1722932
elmarokinh​o
Posté le 23-04-2008 à 15:55:08  profilanswer
 

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 ?

mood
Publicité
Posté le 23-04-2008 à 15:55:08  profilanswer
 

n°1722934
elmarokinh​o
Posté le 23-04-2008 à 15:56:20  profilanswer
 

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
n°1722935
elmarokinh​o
Posté le 23-04-2008 à 15:58:10  profilanswer
 

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
n°1722947
soju
One shot !
Posté le 23-04-2008 à 16:17:40  profilanswer
 

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

n°1722951
soju
One shot !
Posté le 23-04-2008 à 16:19:34  profilanswer
 

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

n°1722954
elmarokinh​o
Posté le 23-04-2008 à 16:21:33  profilanswer
 

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 ...
 

n°1722955
soju
One shot !
Posté le 23-04-2008 à 16:22:50  profilanswer
 

elmarokinho a écrit :

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

non, c'est l'inverse

n°1722959
elmarokinh​o
Posté le 23-04-2008 à 16:27:45  profilanswer
 

soju a écrit :

non, c'est l'inverse


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

n°1722969
elmarokinh​o
Posté le 23-04-2008 à 16:32:56  profilanswer
 

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
n°1723014
masterpsx
Aigloun foutougrafe
Posté le 23-04-2008 à 17:09:07  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Commencer la recherche au rang 'n' de la chaine

 

Sujets relatifs
Problème au niveau d'une chaîne de caractères[access] recherche de prix
Problème " recherche dans mes tables "URGENT !!! Recherche aide concernant AMFPHP (remoting) pour projetGTA4
URGENT ! Recherche programmateur motivé ! Projet GTA 4 - Flash MAPMise en forme d'un fichier xls compliquée
Récuperer un élément dans une chaine ( USER_AGENT )Programme de recherche de liens morts
Manipulation de chaine caractère par boucle[kix] Remplacement d'une chaine de caractère
Plus de sujets relatifs à : Commencer la recherche au rang 'n' de la chaine


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)