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
##### Message du 2009/04/07 15:08:36 #####
De : NOM - IPenvoyée (Adresse@email.deluser)
Pour : Adresse@email.delautre
Sujet : Sujet
Corps :

IP de celui qui appel le script php


Message

#####
(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 texteTexte
► Afficher le texteHTML
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 :shock: )

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). :wink:

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 :

Code : Tout sélectionner

$De = _StringBetween($Chaine, 'De : ', 'Pour : ')
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. 8)

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&#058;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 :mrgreen:

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
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... :wink: Mon pattern ne marchait pas, mais peut etre a t'il utilisé mes essais pour continuer? :P

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 :oops: 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])