Page 1 sur 1
[R] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 18:26
par corrs78
Bonsoir,
Je viens demander votre aide, car je n'arrive pas a maîtriser les expressions régulières.
Alors si une âme charitable pouvait m'ecrire le code (commenté si possible). Ca me permettrait de progresser dans mon programme.
Il faut que j'isole les 2 coordonnées GPS dans cette ligne : (il me faut seulement les 'Digits' et le 'point')
Code : Tout sélectionner
Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation! If you want to get the PHP source code: <a href="http://www.witracks.com.br/gmaps.txt">http://www.witracks.com.br/gmaps.txt</a><br>l o n = 78.462173 <br> l A T = 17.416467
Voici mon début de code :
Code : Tout sélectionner
$line = FileReadLine(@ScriptDir & "\source_witracks.html",1)
$resultat = StringRegExp($line, '(\d{2}).(\d{6})')
ConsoleWrite($resultat)
Merci à vous pour votre contribution.
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 18:44
par Tlem
Vos coordonnées pouvant sans doute être de la forme :
XX.XXXXXX ou
X.XXXX, il vaut mieux adopter ce type de pattern :
Code : Tout sélectionner
#include <Array.au3>
$line = FileReadLine(@ScriptDir & "\source_witracks.html",1)
$resultat = StringRegExp($String, '(\d{1,2}.\d{4,6})', 3)
_ArrayDisplay($resultat)
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 19:07
par corrs78
Merci Tlem. Encore une fois tu me sors de la panade.
le {1,2} veut dire de 1 à 3 caractères (dans ce cas, des chiffres) ? c'est bien ça ?
Une précision, la coordonnée peut-être négative, dans ce cas il y aura un moins ' - ' devant (ça se complique).
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 21:36
par Tlem
Oups, j'avais oublié le signe négatif ...
Code : Tout sélectionner
$resultat = StringRegExp($String, '(\x2d{0,1}\d{1,2}.\d{4,6})', 3)
\x2d signifie uniquement le caractère 0x2d en hexa qui correspond au signe moins.
{0,1} indique de 0 à 1 caractère (donc le caractère peut être absent !!!).
\d signifie uniquement un nombre et {1,2} de 1 à 2 nombres. Pour le dernier segment
{4,6} de 4 à 6 nombres.

Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 22:04
par mikell
@Tlem
Pour mon instruction personnelle : cette expression est-elle valable ?
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 22:19
par Tlem
Dans l'absolu oui. Mais je limiterais le premier bloc à deux nombres maxi et le dernier bloc à 6 nombres maxi.

Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 22:25
par Iste
et moi j’échapperai le point
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 23:04
par corrs78
Tlem a écrit :Oups, j'avais oublié le signe négatif ...
Code : Tout sélectionner
$resultat = StringRegExp($String, '(\x2d{0,1}\d{1,2}.\d{4,6})', 3)
\x2d signifie uniquement le caractère 0x2d en hexa qui correspond au signe moins.
{0,1} indique de 0 à 1 caractère (donc le caractère peut être absent !!!).
\d signifie uniquement un nombre et {1,2} de 1 à 2 nombres. Pour le dernier segment
{4,6} de 4 à 6 nombres.

Merci, j'ai tout compris. C'est vraiment puissant les ExpReg

Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 23:15
par Tlem
En prenant en compte les remarques précédentes, l'expression suivante semble plus adaptée et 'filtrante' :
-? étant identique à
\x2d{0,1}
et
l’échappement du point par
\. afin d’éviter que
78x12345 ne match une réponse possible. ^^
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : dim. 15 janv. 2012 23:55
par corrs78
Merci à tous. Une dernière chose, je viens de remarquer que le site est capable de me renvoyer des réponses curieuses ou il inverse la latitude et la longitude. D'ailleurs, il écrit latitude et longitude d'une façon aléatoire.
voici deux réponses bien différentes :
Comment est-est ce que je peux renvoyer dans mon tableau la latitude en premier.
Je pense qu'il faut se baser sur le caractère "t ou T"
L .... O n= -4.697196 <br> L At ... = 36.498759
L .. a T = 36.498759<br> L o .. N = -4.697196
(les .... sont en fait des 'espaces' qui sont eux aussi générés de façon aléatoires. Le vrai casse tête !
Là c'est complètement hors de mes compétences.
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : lun. 16 janv. 2012 00:33
par Tlem
Hé bien dites donc, j'espère que vous n'allez pas rajouter des contraintes toutes les 5 minutes ...
Bon, voici une solution comme une autre :
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
$String = 'Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation! If you want to get the PHP source code: <a href="http://www.witracks.com.br/gmaps.txt">http://www.witracks.com.br/gmaps.txt</a><br>l o n = 78.462173 <br> l A T = 17.41646'
;$String = 'Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation!'
$String = StringStripWS($String, 8)
$array = StringRegExp($String, '(\w{3}=-?\d{1,2}\.\d{4,6})', 3)
_ArrayDisplay($array) ; Juste pour info
If UBound($array) = 2 Then
Global $Lat, $Lon
If StringInStr($array[0], "lat") Then
$Lat = StringTrimLeft($array[0], 4)
Else
$Lat = StringTrimLeft($array[1], 4)
EndIf
If StringInStr($array[0], "lon") Then
$Lon = StringTrimLeft($array[0], 4)
Else
$Lon = StringTrimLeft($array[1], 4)
EndIf
Msgbox(64, "Info", "Latitude = " & $Lat & @CRLF & "Longitude = " & $Lon)
Else
Msgbox(16, "Erreur", "Aucune information disponible")
EndIf
Je ne doute pas qu'il soit possible de le faire plus simple, mais au moins ça fonctionne.

Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : lun. 16 janv. 2012 04:25
par jchd
Une intervertion optionnelle de captures est malaisée en RE, mais voilà ce qu'on peut faire, qui doit couvrir tous les cas envisagés :
Code : Tout sélectionner
Local $aHtml[4] = [ _
'Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation! If you want to get the PHP source code: <a href="http://www.witracks.com.br/gmaps.txt">http://www.witracks.com.br/gmaps.txt</a><br>l o n = 78.462173 <br> l A T = 17.416467', _
'Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation! If you want to get the PHP source code: <a href="http://www.witracks.com.br/gmaps.txt">http://www.witracks.com.br/gmaps.txt</a><br> lo n = 78.462173 <br> LA t = 17.416467', _
'Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation! If you want to get the PHP source code: <a href="http://www.witracks.com.br/gmaps.txt">http://www.witracks.com.br/gmaps.txt</a><br> l A T = -17.416467<br>l o n = -78.462173 ', _
'Your IP: 82.000.00.102<br>Please, this is only for test, use with moderation! If you want to get the PHP source code: <a href="http://www.witracks.com.br/gmaps.txt">http://www.witracks.com.br/gmaps.txt</a><br>lon= 178.462173 <br> l A T= -0.4167 ' _
]
Local $lon, $lat, $Pos
For $html In $aHtml
$html = StringStripWS($html, 8)
$Pos = StringRegExp($html, "(?i:<br>lon=(-?\d*\.\d+)<br>lat=(-?\d*\.\d+)|<br>lat=(-?\d*\.\d+)<br>lon=(-?\d*\.\d+))", 1)
If Not @error Then
If UBound($Pos) = 2 Then
$lon = Number($Pos[0])
$lat = Number($Pos[1])
Else
$lon = Number($Pos[3])
$lat = Number($Pos[2])
EndIf
Else
; position non trouvée
$lon = "Nan"
$lat = "Nan"
EndIf
MsgBox(0, "Position", "Lat = " & $lat & @LF & "Lon = " & $lon)
Next
NB : la longitude va de -180° à 180°, donc sur trois chiffres. J'ai opté pour la possibilité que le site ne produise pas de zéro avant la virgule pour les angles < 1° en valeur absolue (e.g. -.12345 au lieu de -0.12345)
Edit : ai coupé dans la viande pour simplifier le pattern.
Re: [..] Expression Régulière = c'est pas mon truc. Help me.
Posté : lun. 16 janv. 2012 09:57
par corrs78
Merci à tous ça fonctionne.