Page 1 sur 1

Recuperation avec eregi dans du javascript ?

Posté : 28 janv. 2008, 14:07
par Dbzes
Bonjour,

Voila je souhaite recuperer dans une information, mais le probleme c'est que l'info se trouve entouré de javascript et apparament la fonction eregi ne marche ( ou alors c'est moi qui bug)

voici une parti de la source :

Code : Tout sélectionner

..</td></tr> </table> </td> <script language="JavaScript" type="text/javascript"> AddLineOne(); AddTableTitle(PrinterGen[5]); AddLineOne(); StartTable(); AddLineTwo(); var sData = Array(); sData[0] = "10.11.203.247"; sData[1] = "SALLE102".toUpperCase(); sData[2] = "0, 01:35:06"; sData[3] = "00:C0:EE:74:0C:47"; sData[4] = "2G6_3000.004.001"; sData[5] = "2G6_1000.001.011"; sData[6] = "XLL6Y06809"; sData[7] = "112"; sData[8] = ""; RO2ColRow(TCPIP[2],sData[0]); RO2ColRow(TCPIP[1],sData[1]); RO2ColRow(PrinterGen[6],sData[2]); RO2ColRow(PrinterGen[10],sData[3]); RO2ColRow(PrinterGen[3],s..
je souhaite recuperer l'adresse ip "10.11.203.247", donc j'ai fait :
	$adresse = "http://10.11.203.247/fra/start/start.htm" ; // adresse de la page à exploiter
  $page = @file_get_contents ($adresse); // récupérér le contenu de la page 
	$titre = @eregi('sData[0] = "(.*)";',$page,$nom);
	echo "$nom[1] <BR>" ;
Mais le script n'affiche rien dans ma pas web

Merci pour votre aide car je ne comprend pas pourquoi...

Posté : 28 janv. 2008, 14:12
par Berzemus
peut-être qu'en enlevant les "@" devant les différentes fonctions, les erreurs qu'ils causent pourraient s'afficher :wink:

De même que ton regex est erroné, il vaut mieux sélectionner l'adresse par la négative (un "selecteur négatif", mais je me souviens plus du nom exact):

Code : Tout sélectionner

sData\[0\] = "([^"]+)";
Et par ailleurs, c'est mieux d'utiliser preg_match() que ereg(), c'est plus performant.

Posté : 28 janv. 2008, 14:19
par Dbzes
ca ne change rien, j'ai essayer de piquer un element se trouvant entre <h1></h1> et bien ca marche meme en laissant les @.

Me demande si c'est le javascript ou une mauvaise interpretation de la fonction qui'mepeche laffichage ?

edit: apparament la fonction "preg_match" sert a chercher un mot precis moi je pense pas que cela peut marcher car l'adresse IP que je souhait afficher change donc il ne trovera pas le mot exact...

Posté : 28 janv. 2008, 14:43
par Berzemus
:roll:

C'est gentil de me dire ce que tu penses des fonctions php, mais as-tu bien lu les remarques ?
Note: preg_match(), qui utilise la syntaxe des expressions rationnelles compatibles PERL, est une alternative plus rapide de ereg().
Ereg recherche une expression rationale standard (regex), Preg_match() aussi, mais mieux (sans versers dans les détails).

Les "@", certes décoratifs, sont à éviter comme la peste en PHP (sauf si tu connais très exactement leur fonctionnement, et que tu connais les risques; on reste libre après tout): ils empêchent tout simplement à la fonction d'afficher une erreur. Et masquer les erreurs, c'est pas pratique quand on cherche à savoir pourquoi quelque chôse ne fonctionne pas.

Si tu importes ta source dans une variable, le JS n'est pas interpreté, c'est que du texte. Je tenterais un echo de ta variable '$page', juste pour voir s'il contient bien ce qu'il doit contenir (surtout la partie js).

Et les brackets ( [ et ] ) doivent être échappés (mettre un \ devant), donc ta requête devient
sData\[0\] = "(.*)";

Posté : 28 janv. 2008, 15:09
par Dbzes
Bon c'est bien on avance en faites fallait mettre les brakets du coup now sur ma page il maffiche ca : (alors qu'avant il yava rien ^^

Code : Tout sélectionner

10.11.203.247"; sData[1] = "SALLE102".toUpperCase(); sData[2] = "0, 02:48:33"; sData[3] = "00:C0:EE:74:0C:47"; sData[4] = "2G6_3000.004.001"; sData[5] = "2G6_1000.001.011"; sData[6] = "XLL6Y06809"; sData[7] = "112"; sData[8] = ""; RO2ColRow(TCPIP[2],sData[0]); RO2ColRow(TCPIP[1],sData[1]); RO2ColRow(PrinterGen[6],sData[2]); RO2ColRow(PrinterGen[10],sData[3]); RO2ColRow(PrinterGen[3],sData[4]); RO2ColRow(PrinterGen[4],sData[5]); RO2ColRow(PrinterGen[1],sData[6]); RO2ColRow(PrinterGen[2],sData[8]); if(0==0 && (1>>1)!=1){ RO2ColRow(Counters[7],sData[7]); } document.write(''); document.write('
Apparament il s'arrete à la balise </script> une idée pour l'arreter juste apres l'adresse ip car le "; n'y fait rien , ca ne larrete pas

:roll:

Merci ;)

Posté : 28 janv. 2008, 15:20
par Ryle
Essaye en utilisant les options des expressions régulières, et notament l'option "U" qui enlève le caractère gourmand de l'expression, afin que celle-ci s'arrête à la plus petite occurence trouvée et non à la plus grande :)
#sData\[0\] = "(.*)";#U

Posté : 28 janv. 2008, 15:26
par Dbzes
j'ai mis de la meme facon que toi, mais du coup cela ne m'affiche plus rien :s

Posté : 28 janv. 2008, 15:33
par Berzemus
je me contenterais de dire que la solution à été donné plus haut (pas vraiment pour cette problématique, mais l'effet est le même). Faut savoir y mettre du sien aussi. :roll:

Posté : 28 janv. 2008, 15:36
par Dbzes
Je ne comprend pas sa phrase :
"l'option "U" qui enlève le caractère gourmand de l'expression"

Elle est un peu trop technique si quelque peut me l'expliquer avec des mots moins technique merci ;)

Posté : 28 janv. 2008, 15:47
par Berzemus
Tu utilises la notation Regex pour chercher ton adresse ip.

Utiliser le point (qui correspond à n'importe quoi) et le faire répeter une infinité de fois, conduit forcément à prendre en compte tout le reste de la chaîne (du texte). Tu devrais revoir la doc sur les regex:
http://www.siteduzero.com/tuto-3-168-1- ... e-1-2.html

Ce que ryle te propose, c'est de rendre le point moins "avare". Tant qu'il est avare, le point prends tout, et s'arrête en fait à la dernière occurence de ce qui le suit ("; dans ton cas). avec l'option U (pour ungreedy), il s'arrête a la première occurence.

Mais ce que ryle te propose ne peut marcher pour toi, puisqu'on ne peut pas appliquer ces modificateurs avec ereg() (sauf erreur de ma part), mais bien avec preg_match().

Or j'ai proposé un peu plus haut une autre manière de sélectionner l'adresse (par la négative), qui devrait marcher ereg().

Ceci dit, je ne comprends pas bien pourquoi tu restes avec ereg().. :?:

Posté : 28 janv. 2008, 16:03
par Dbzes
ok je comprend mieux, mias il ya une chose que je voudrais savoir si vous aviez bien compris, c'est que l'adresse IP qui est present dans le javascript n'est pas toujours la meme donc il ya bien toujours une adresse IP qui est la mais les chiffres changent, donc j'ai du mal a comprendre comment la fonction arrivera a reconnaitre un chiffre qui n'est pas la ??

edit: je pense piger le truc de regex donc j'ai fait ca :
if (preg_match("#10.*.*.*#", "http://10.11.203.247/fra/start/start.htm"))
{
echo 'ip est la';
}
else
{
echo 'pas d'ip';
}
du coup now je souhaiterais afficher la chaine quil a trouvé, on fait commet ?

Merci encore

Posté : 28 janv. 2008, 17:17
par Berzemus
Ah, pauvre de moi, je comprends ton souci.. tu interprêtes l'astérisque (*) comme un caractère "joker" ? ha non, c'est absolument pas ça..

Le regex, c'est de toute beauté, pour récuperer du texte ou faire un remplacement en pouvant soit être assez général soit extrêmement spécifique. Et tout particulièrement si c'est variable. (article wikipedia). C'est bien plus qu'un simple "joker", c'est un peu comme transformer du texte en formule mathématique.. :love1: , mais il faut aimer..

Par exemple, pour sortir des adresses IP d'un bloc de texte, peu importe ce qui s'y trouve, peu importe la taille, ce petit bout suffit:

Code : Tout sélectionner

(\d{1,3}\.){3}\d{1,3}
Tout beau hein ? ça me trouve 3 groupements de 1 à 3 chiffres suivis d'un point, le tout suivi de 1 à 3 chiffres (en gros, 4 groupes de 1 à 3 chiffres séparés par un point), et ceci PEU IMPORTE les chiffres. Tant que la forme (obligatoire) de l'adresse ip est respécté.

Donc en adaptant ton code:
$adresse = "http://10.11.203.247/fra/start/start.htm" ; // adresse de la page à exploiter
  $page = file_get_contents ($adresse); // récupérér le contenu de la page 
    $titre = preg_match("#(\d{1,3}\.){3}\d{1,3}#",$page,$matches);
    print_r($matches) ; 
(a notre que preg_match va te sortir la première occurence d'une adresse IP. Si tu en veux plusieurs, il faut simplement utiliser preg_match_all() )

Posté : 28 janv. 2008, 17:26
par Ryle
Oups, effectivement, je n'ai fait que survolé le sujet et je pensais que tu étais passé au pcre avec preg_match() et n'ai pas fait attention au fait que tu continuais d'utiliser ereg()

Pour ton expression, elle n'est pas encore bonne mais tu es sur la bonne voie. Il faut faire attention au fait que certains caractères ont une signification bien particulière. Le point correspond à n'importe quel caractère, l'étoile quant à elle est un quantificateur, elle indique que l'élément peut être présent de 0 à N fois. Ainsi " .* " signifie n'importe quel caractère de 0 à N fois et ce n'est pas assez précis pour déterminer ton adresse ip. Tu pourrais donc préciser qu'il s'agit d'un véritable point en l'échapant avec un antislash " \.". Ton masque ressemblerait alors à :
#10\..*\..*\..*#
Mais il suffit d'avoir un 10 et quelques points dans une phrase pour que ce masque corresponde à d'autres chaines (genre, "En français j'ai eu 10. En math 12. Et une bulle en sport...." et hop, on est dans le masque :)).

Il existe de nombreux masques pouvant correspondre à une adresse ip, pouvant être plus ou moins précis (vérifiant par exemple que chaque nombre est comprit entre 0 et 255), donc tout dépend du contexte et de ce que tu as autour. Voici une suggestion pour essayer de t'expliquer un peu comment on construit un masque :

Supposons que le format de l'ip que tu cherches soit "10.xxx.xxx.xxx" : le nombre 10, suivit d'un point, suivit de 1 à 3 chiffres, suivient d'un point, suivit de 1 à 3 chiffres, suivient d'un point, suivit de 1 à 3 chiffres.
L'idée est donc de définir un masque qui corresponde à ce format (je ne vais pas vérifier que les nombres sont inférieurs à 256, etc. mais tu pourras toujours t'amuser à essayer de le faire)

On recherche donc à l'intérieur de ta chaine une sous-chaine avec un "10" suivit d'un point : #10\.#
puis l'on doit trouver un chiffre (on va utiliser une classe autorisant les caractères de 1 à 9) : #[0-9]#
Et l'on veut que ce chiffre n'apparaisse que de 1 (minimum) à 3 fois (maximum) : #[0-9]{1,3}#
Et cela 3 fois

En assemblant tout ça, notre masque va donc ressembler à
#10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#
Que l'on peut également écrire ainsi :
#10(\.[0-9]{1,3}){3}#
Edit : bon ben grillé, mais maintenant que c'est écrit, je l'poste quand même ;)