Page 1 sur 2
[R] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 19:02
par Iste
Salutations,
Bon, le titre est pas top top, mais vous devriez comprendre avec ce qui suit.
J'ai un script php qui ecrit ses log les un au dessus des autre dans une page html
Les log se présentent tous de la meme maniere
(note : les couleurs sont aléatoires)
Ce qui donne en html
Code : Tout sélectionner
<b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br>
J'aimerais donc pouvoir recuperer ces log (bon ca facile) et les trier
Mais comme tout est ecrit en une seule ligne, je sais pas trop comment faire :/
Donc, j'aimerais un bout de script ou une fonction, qui se chargerait de trouver tout les message, et de recup le info
(par exemple en créant un array 2D)
Apres, je pense pouvoir me demerder pour le reste, pis sinon je reviendrais demander de l'aide
Voila, merci beaucoup ^^
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 19:41
par Tlem
Eventuellement, avec StringSplit et en utilisant comme séparateur, le mot Message.
Sinon, il faudrait plus d'éléments (une suite de messages) et les éléments exact de ce que vous voulez récupérer et comment vous les voulez.
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 19:55
par Iste
En effet, séparer les messages est possible avec Stringsplit("","##### Message",1) sauf si le corps d'un des message contien cette chaine de caractere...
(normalement ca devrait pas arriver ^^' et on peut sécuriser en rajoutant le <b>, mais bon...)
Sinon, le log ben, pour avoir une petit idee de a quoi il ressemble suffit de copier coller les exemple (je peux pas mettre plus car il contient des info privé :/
► Afficher le texteHTML
Code : Tout sélectionner
<b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br><b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br><b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br>
Sinon, j'aimerais bien recup les infos suivante de la facon suivante :
$var [n][0] = date (2009/04/07)
$var [n][1] = heure (15:08:36)
$var [n][2] = NOM
$var [n][3] = IPenvoyée
$var [n][4] =
Adresse@email.deluserdate (2009/04/07)
$var [n][5] =
Adresse@email.delautre
$var [n][6] = Sujet
$var [n][7] = IP de celui qui appel le script php
$var [n][8] = Message
En tout cas, merci pour l'idée du stringsplit(), je sais pas pourquoi je n'y avait pas pensé ! Avec je dois pouvoir récuperer une grande parti des info (en découpant avec StringLeft/Right() ca devrait passer)
Toute foi c'est pas tres propre, et les log etant long, j'ai un peu peur du temps d'execution :/
voila, encore merci !
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 20:24
par GaRydelaMer
Bonsoir
tu as aussi les Regexp qui sont vraiment trés utiles pour ce genre d'analyse.
[HS:On]
Étonnant que Tlem ne l'est pas préciser dans son message

Voir la suppression dans un tableau
[/HS]
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 21:09
par Toiinou
Évidemment qu'il faut utiliser des RegExp(Je vois pas d'autres solutions

)
Je pense qu'il faudrait capturer chaque "bloc" en prenant tout ce qu'il y a entre "<b>##### Message du " & "</br><b>#####</b></br></br><b>##### Message du "(Un peu a la barbare mais avec des RegExp comme ça c'est souvient bien "sécuriser") puis ensuite faire une boucle avec différentes RegExp pour chaque éléments. Je vais essayer de voir ce que je peut faire déjà qu'avec PHP et les RegExp je me prend la tête...
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 21:21
par Tlem
J'avais bien pensé aux Regexp, mais c'est franchement pas du tout ma spécialité.
Perso, je trouve que ça permet de faire plein de chose en peut de code, mais c'est pas forcément plus rapide (en terme de rapidité d'exécution et surtout en réalisation du pattern).
Donc là en l'occurrence, je privilégierais plus le code que la Regexp.
Voici ce que je ferais :
1 - Récupération du texte brut (pas le html)
2 - StringSplit sur ##### .Cela nous donnera un tableau avec élément = date du Log et élément +1 = le Log.
3 - Décomposition de la chaîne date et heure (toujours StringSplit mais sur l'espace).
4 - Décomposition de la chaîne du Log (un ptit peut plus complexe).
Je ferais une lecture de chaîne à la recherche de mon élément de recherche (
De : <= par exemple) puis je lirais ma chaîne jusqu'au
@CR
Idem avec '
Pour :', '
Sujet :',
Corps : ...
Ou plus simplement, on peut utiliser un
_StringBetween ce qui donnerait pour le champ De :
Bon voilà, j'ai exposé mon avis, mais il y à d'autres façons.
Edit : Après avoir re-visionner le texte, je ferais un StringSplit sur le retour de ligne. Ca nous donnerais un tableau qui contiendrais chaque élément à récupérer. Donc il suffit de contrôler l'élément de début (la date), de la parser, puis de parser les lignes qui suivent puisqu'elles ont toujours le même format.

Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 22:22
par timmalos
Bon ben les modos sont la pour se completer,j'ai pour ma part passé la soirée a trouver un regex, j'ai pas réussi, mais l'avancement peur servir donc je pose le code:
Code : Tout sélectionner
Global $i = 0
$string = '<b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse.test@sfr.fr</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br>'
$reponse = StringRegExp ( $string, '##### Message du ([0-9]{4}(/[0-9]{2}){2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})',2)
MsgBox(0,@error,@extended)
$reponse2 = StringRegExp ( $string, ' #####</br>De : <font color="[A-F0-9]{6}">([A-Z]+) - (([0-9]{1,3}\.){3}[0-9]{1,3})</font> \(<font color="#[a-fA-F0-9]{6}">(([a-zA-Z0-9_-])+([.]?[a-zA-Z0-9_-]{1,})*@([a-zA-Z0-9-_]{2,}[.])+[a-zA-Z]{2,4})</font>\)',2)
MsgBox(0,@error,@extended)
for $i = 0 to UBound($reponse2) - 1
msgbox(0, "RegExp Test with Option 3 - " & $i, $reponse2[$i])
Next
MsgBox(0,"date",$reponse[1])
MsgBox(0,"heure",$reponse[3])
Je pense qu'il manque pas grand chose, mais la 2eme ne marche pas, donc je n'ai pas pu l'inclure à la première ce que je voulais faire à la base.
Ceci ne gère que les informations à l'interieur d'un seul message, il faudra auparavant faire une boucle avec une regex ou StringSplit Pour séparer tous les messages.
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 22:35
par GaRydelaMer
Bonsoir
J'ai fais ca quand à moi :
Code : Tout sélectionner
$text = "##### Message du 2009/04/07 15:08:36 #####" & @CRLF & _
"De : NOM - IPenvoyée (Adresse@email.deluser)" & @CRLF & _
"Pour : Adresse@email.delautre" & @CRLF & _
"Sujet : Sujet 1" & @CRLF & _
"Corps :" & @CRLF & _
"" & @CRLF & _
"IP de celui qui appel le script php" & @CRLF & _
"" & @CRLF & _
"Message 1" & @CRLF & _
"" & @CRLF & _
"#####" & @CRLF & _
"" & @CRLF & _
"##### Message du 2009/04/06 15:08:36 #####" & @CRLF & _
"De : NOM - IPenvoyée (Adresse@email.deluser)" & @CRLF & _
"Pour : Adresse@email.delautre" & @CRLF & _
"Sujet : Sujet 2" & @CRLF & _
"Corps :" & @CRLF & _
"" & @CRLF & _
"IP de celui qui appel le script php" & @CRLF & _
"" & @CRLF & _
"Message 2" & @CRLF & _
"" & @CRLF & _
"#####"
$text = StringRegExpReplace($text, " #####|##### ", "")
$text = StringTrimRight($text, 5)
$text = StringRegExpReplace($text, "#####\s*", "|")
$logs = StringSplit($text, "|")
For $i = 1 To $logs[0]
$date = StringRegExp($logs[$i], "du ([0-9 :/]*)", 3)
ConsoleWrite("++ Date ++" & $date[0] & @LF)
$de = StringRegExp($logs[$i], "De : (.*)", 3)
ConsoleWrite("++ De ++" & $de[0] & @LF)
$pour = StringRegExp($logs[$i], "Pour : (.*)", 3)
ConsoleWrite("++ Pour ++" & $pour[0] & @LF)
$sujet = StringRegExp($logs[$i], "Sujet : (.*)", 3)
ConsoleWrite("++ Sujet ++" & $sujet[0] & @LF)
$pos = StringInStr($logs[$i], "Corps :")
$msg = StringTrimLeft($logs[$i], $pos + 6)
ConsoleWrite("++ Msg ++" & $msg & @LF)
Next
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 22:47
par Iste
Wouu plein de réponses ^^ merci !
Je ne connaissais pas _StringBetween, cette fonction peut merveilleusement m'aider
Mais moi je bloque bien avant ^^'
Comment recuprer le texte tel qu'il s'affiche ? histoire d'eviter d'etre embeté par les couleurs alléatoires et pouvoire se caler sur les retour a la ligne.
Ensuite, apres avoir stringsplité entre ##### et apliqué le code de timmalos (merci a lui

) me sufira de faire comme tlem a dit pour récup tout les info 1er du log.
Recup l'adresse entre parentheses et s'eparer l'IP du corps du message ne devrait pas etre trop compliqué apres ca
Encore merci a vous tous de vous interesser a mon probleme !
Edit : GaRydelaMer a posté pendant que je rédigai mon message, je regarde ton code tout de suite

merci
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 23:03
par GaRydelaMer
Edit
Au début du script pour enlever le HTML
Code : Tout sélectionner
$text = StringReplace($text, "</br>", @CRLF)
$text = StringRegExpReplace($text, "</?[^>]*>*", "")
Re: [..] Recuperer des info d'un fichier
Posté : mar. 07 avr. 2009 23:33
par Tlem
Ha ha ha ... Challenge quand tu nous tiens.
Voilà pour récupérer le corp du texte d'un fichier HTML et dans votre cas le mettre en tableau :
Code : Tout sélectionner
#include <IE.au3>
#Include <Array.au3>
$LeFichier = "Test.html"
$oIE = _IECreate ("about:blank", 0, 0)
$html = FileRead($LeFichier)
_IEDocWriteHTML($oIE, $html)
$sText = _IEBodyReadText ($oIE)
$aHtml = StringSplit(StringReplace($sText, @CR, ""), @LF)
_ArrayDisplay($aHtml,"")
La méthode de Gary est excellente dans votre cas, mais si la page venait à avoir d'autres balises non prises en charge par le pattern, alors cela fausserait le résultat.
Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 01:04
par Iste
ben je vais prendre la methode a gary alors

car je suis (presque) sûr qu'il n'y aura pas de balise mechantes, et sutout, car les fonction _IE sont beaucoup trop lentes et lourdes pour moi ^^'
Mais merci quand meme pour l'astuce, car si je viens a en avoir besoin, c'est deja dans la poche
Bon beh, je crois que avec tout ca je vais bien pouvoir m'amuser
Je clos pas le poste, car j'ai pas encore testé xD pis au cas ou il vous viendrez l'envie d'en faire un peu plus :p
Mais c'est deja super
Merci a vous tous !
Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 02:19
par Toiinou
Moi j'ai fais sa :
Code : Tout sélectionner
#include <Array.au3>;Seulement pour afficher l'array finale avec _ArrayDisplay
Dim $file, $read, $NbRow, $nOffset = 1, $array, $Message = 0
;Ouvrir la page html pour la lire
$file = FileOpen('pagedelog.html', 0)
$read = FileRead($file)
FileClose($file)
;Compter le nombre de messages et préparer le tableau finale 2D
$NbRow = StringRegExp($read, '<b>##### Message du (.*?)</br><b>#####</b></br></br>', 4)
$NbRow = UBound($NbRow)
Dim $Arr[$NbRow][9]
While 1
;Regex de séparation des elements
$array = StringRegExp($read, '<b>##### Message du ([0-9]{4}/[0-9]{2}/[0-9]{2})\s([0-9]{2}:[0-9]{2}:[0-9]{2})\s#####</br>De\s:\s<font color="#?[0-9A-F]{6}">([A-Za-z]+)\s-\s([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})</font>\s\(<font color="#?[0-9A-F]{6}">([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})</font>\)\s</br>Pour\s:\s<font\scolor="#?[0-9A-F]{6}">([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})</font></br>Sujet\s:\s<font\scolor="#?[0-9A-F]{6}">([A-Za-z]+)</font></br>Corps\s:\s</br></br><html><head><title>.*?</title></head><body><b>([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})</b></b></br></br>(.*?)</br><b>#####</b></br></br>', 1, $nOffset)
If @error = 0 Then
$nOffset = @extended
Else
ExitLoop
EndIf
;Ajouter les elements dans le tableau finale
For $i = 0 To UBound($array) - 1
$Arr[$Message][$i] = $array[$i]
Next
$Message = $Message+1
WEnd
_ArrayDisplay($arr);Juste pour afficher l'array finale
Avec une
belle grande RegExp

Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 03:18
par Iste
Merci Toiinou ! Ca m'a l'air d'etre ce que je cherchais

A ca pret que chez moi ca marche pas :/
Le super patern ne trouve rien :\
Jai testé avec ceci :
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>;Seulement pour afficher l'array finale avec _ArrayDisplay
Dim $file, $read, $NbRow, $nOffset = 1, $array, $Message = 0
;Ouvrir la page html pour la lire
$file = FileOpen('data (1).html', 0)
$read = '<b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br><b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br><b>##### Message du 2009/04/07 18:08:47 #####</br>De : <font color="40BFBF">NOM - IPenvoyée</font> (<font color="#FF8040">Adresse@email.deluser</font>) </br>Pour : <font color="308040">Adresse@email.delautre</font></br>Sujet : <font color="808040">Sujet</font></br>Corps : </br></br><html><head><title>Nom de la page internet</title></head><body><b>IP de celui qui appel le script php</b></b></br></br>Message</br><b>#####</b></br></br>'
FileClose($file)
;Compter le nombre de messages et préparer le tableau finale 2D
$NbRow = StringRegExp($read, '<b>##### Message du (.*?)</br><b>#####</b></br></br>', 4)
$NbRow = UBound($NbRow)
Dim $Arr[$NbRow][9]
While 1
;Regex de séparation des elements
$array = StringRegExp($read, '<b>##### Message du ([0-9]{4}/[0-9]{2}/[0-9]{2})\s([0-9]{2}:[0-9]{2}:[0-9]{2})\s#####</br>De\s:\s<font color="#?[0-9A-F]{6}">([A-Za-z]+)\s-\s([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})</font>\s\(<font color="#?[0-9A-F]{6}">([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})</font>\)\s</br>Pour\s:\s<font\scolor="#?[0-9A-F]{6}">([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})</font></br>Sujet\s:\s<font\scolor="#?[0-9A-F]{6}">([A-Za-z]+)</font></br>Corps\s:\s</br></br><html><head><title>.*?</title></head><body><b>([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})</b></b></br></br>(.*?)</br><b>#####</b></br></br>', 1, $nOffset)
If @error = 0 Then
$nOffset = @extended
Else
ExitLoop
EndIf
;Ajouter les elements dans le tableau finale
For $i = 0 To UBound($array) - 1
$Arr[$Message][$i] = $array[$i]
Next
$Message = $Message+1
WEnd
_ArrayDisplay($arr);Juste pour afficher l'array finale
Je suis trop nul pour comprendre d'ou vient le probleme ^^' mais je vias quand meme chercher :p
en tout cas, merci encore !
Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 10:59
par Toiinou
Mon pattern teste les vrais faux log c'est a dire qu'il teste si " a la place d' "IPenvoyée" sa a bien la forme d'une ip, si "
Adresse@email.delautre" a bien la forme d'une email, etc donc si tu teste avec ta page ou tes log sont enregistré par le script php sa devrait fonctionner ?
Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 11:22
par Iste
ho ben, j'ai pas regardé dans ce sens là.
Je vais m'y attarder plus attentivement les quelque jours de vac que j'ai devant moi, je vous tiendrais au courant a mon retour !
Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 13:54
par timmalos
Toiinou a fait exactement ce à quoi je voulais arriver, au mot pret

, sauf que lui il a reussi, snif...

Mon pattern ne marchait pas, mais peut etre a t'il utilisé mes essais pour continuer?

Re: [..] Recuperer des info d'un fichier
Posté : mer. 08 avr. 2009 14:07
par Toiinou
Ouép, j'ai tricher j'ai pris en prenant ton début du pattern qui servait a récupérer la date et l'heure

Ta essayer mon pattern ? il fonctionne ?
Re: [..] Recuperer des info d'un fichier
Posté : jeu. 16 avr. 2009 18:18
par Iste
@Toiinou, me suis cassé la tete a essayer de comprendre ton patern, mais maintenant que j'ai compris, il marche impec ^^
Mais, il n'y a pas moyen, comme en php, de récuperer ce qui se trouve dans chaque parenthese, afin de l'isoler dans une variable ?
Pas trouvé de ca sur la doc :/
Re: [..] Recuperer des info d'un fichier
Posté : dim. 19 avr. 2009 11:45
par timmalos
Si y'a moyen, c'est ce que j'ai fait dans mon code, pour le premier pattern.
$reponse = StringRegExp ( $string, 'pattern',2)
Puis
MsgBox(0,"date",$reponse[1])
MsgBox(0,"heure",$reponse[3])