[...] StringRegExp

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Vincent31
Niveau 3
Niveau 3
Messages : 46
Enregistré le : dim. 13 nov. 2011 12:56
Status : Hors ligne

[...] StringRegExp

#1

Message par Vincent31 »

Bonsoir à tous

j'en appel à votre aide car je me casse les dents sur StringRegExp j'ai du mal avec les filtres
je cherche à relever toutes les options possibles dans une cascade de maniere générale
par exemple

Code : Tout sélectionner

  
#include <IE.au3> 
#include <String.au3>
#include <Array.au3>
 
$osource = BinaryToString(InetGet("http://www.meetic.fr/")) 

Local $nOffset = 1
Local $array

While 1
          $array=StringRegExp($osource,'<option value="(.+?)">(?s) "qui cherche" (?s)</option>',1)
     If @error = 0 Then
        $nOffset = @extended
    Else
        ExitLoop
    EndIf
    For $i = 0 To UBound($array) - 1
        MsgBox(0,$i, $array[$i])
    Next
WEnd

 


En fait je souhaites récupérer le 21 le 12 le 22 et le 11 qui sont les values respectives de "une femme qui cherche un homme" ; "un homme qui cherche ..."

PS le script n'a aucun rapport avec meetic : la pub vient juste de passer à la tv c'est pour ça je me suis dit (ah sur ce site il doit y avoir des cascades!

je ne comprend pas trop les (?s) et (.+?) ... c'est surement la ?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [...] StringRegExp

#2

Message par jchd »

Préférer _IE.au3
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] StringRegExp

#3

Message par mikell »

Il y a plusieurs exemples de découpe de code-source au regex sur le forum
Le dernier en date est là
http://www.autoitscript.fr/forum/viewto ... 503#p79503
Mais il est quand même vivement conseillé d'apprendre un minimum de bases de regex avant de s'y attaquer

Code : Tout sélectionner

#include <String.au3>
#include <Array.au3>
 
$source = BinaryToString(InetRead("http://www.meetic.fr/", 4))
$source2 = _StringBetween($source, "my_kvk2", "</select>")     ; pour limiter la recherche à une portion du code-source
$array = StringRegExp($source2[0],'<option\s+value="(\d+)">u', 3)
_ArrayDisplay($array)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [...] StringRegExp

#4

Message par jchd »

Le problème avec le html est que le contenu est terriblement dynamique de nos jours. Certains gros sites sont incapables de fournir deux fois de suite la même page et je ne parle pas ici des pubs aléatoires. Des sites dont le load-balancing est mal goupillé servent des pages fonctionnellement équivalentes mais au contenu distinct.

J'ai connu des sites qui balançaient des tabs, CR, LF et autre palanquées d'espaces à peu près n'importe quand entre les éléments. Comme HTML ignore la plupart des espacements (H et V) ça ne gêne pas l'opération mais les regexps plantent allègrement.

De plus, au moindre changement d'un attribut secondaire (ou de l'ordre des attributs) ça part en vrille...

_IE
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] StringRegExp

#5

Message par mikell »

Tout ça est vrai mais reste que si tu veux faire par exemple un test régulier sur une page, _IE c'est terriblement lourd et bandwidthophage ^^
Cela dit si le site est si dynamique que ça les fonctions _IE peuvent aussi avoir des soucis
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Vincent31
Niveau 3
Niveau 3
Messages : 46
Enregistré le : dim. 13 nov. 2011 12:56
Status : Hors ligne

Re: [...] StringRegExp

#6

Message par Vincent31 »

Merci à tous les deux je prends note des potentiels aleas du code html.

Pour ce qui est de la fonction qui est actuellement

Code : Tout sélectionner

$array=StringRegExp($source2[0],'value="(\w+)">(\w+)<', 3)
je souhaiterais la modifier : au lieu d'écrire les deux groupes je souhaiterais n'ecrire que le deuxieme j'ai essayé

Code : Tout sélectionner

StringRegExp($source2[0],'value="(?i)">(\w+)<', 3)
mais (?i) n'a pas l'air d'être le bon ni (?-i)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] StringRegExp

#7

Message par mikell »

Est-ce que c'est ça que tu cherches à obtenir ?

Code : Tout sélectionner

$array=StringRegExp($source2[0],'value=".+?">([^<]+)', 3)
La syntaxe doit être très précise en fonction du résultat recherché
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Vincent31
Niveau 3
Niveau 3
Messages : 46
Enregistré le : dim. 13 nov. 2011 12:56
Status : Hors ligne

Re: [...] StringRegExp

#8

Message par Vincent31 »

ça a l'air impeccable on est d'accord que [^<]+ considère n'importe quel groupe qu'il contienne des espaces virgules lettres chiffres tirets(-) parenthèses ?

parce que d'après l'aide je conclurais que le ^ ne permet pas de considerer les chiffres, quant au < dans les crochets je n'ai rien trouvé dans l'aide la dessus

Effectivement il faut etre extrement rigoureux mais la syntaxe n'est pas facile a assimiler. Merci de ta patience!
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] StringRegExp

#9

Message par mikell »

Il y a souvent plusieurs possibilités de syntaxe, certaines meilleures que d'autres
([^<]+) signifie "prend 1 ou plusieurs caractères consécutifs qui ne sont pas <" (s'arrête donc au 1er < rencontré)
Dans ce cas précis c'est donc équivalent à (.+?)< "prend tout jusqu'au 1er < rencontré"
Si tu lis l'anglais tu devrais regarder ce tutoriel : http://www.asiteaboutnothing.net/regex/
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [...] StringRegExp

#10

Message par jchd »

mikell a écrit :([^<]+) signifie "prend 1 ou plusieurs caractères consécutifs qui ne sont pas <" (s'arrête donc au 1er < rencontré)
Dans ce cas précis c'est donc équivalent à (.+?)< "prend tout jusqu'au 1er < rencontré"
Pas exactement : ils s'agit de faux jumeaux !

([^<]+) s'arrête avant le 1er < ou la fin du sujet. Ici < peut très bien ne pas figurer dans le sujet.
(.+?)< s'arrête avant le 1er < (qui doit figurer dans le sujet).

L'identité des résultats n'est garantie ici qu'à la condition qu'il n'y ait pas de fin de ligne dans la valeur capturée. Même si pour ce cas de figure précis on peut penser que cette condition est remplie, il n'en va évidemment pas toujours ainsi.

C'est la sémantique (ce qu'on veut exprimer) qui doit être d'une précision absolue ; la syntaxe n'en est qu'une conséquence.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] StringRegExp

#11

Message par mikell »

Hmm bonjour le tri sélectif :mrgreen:
mikell a écrit :Dans ce cas précis c'est donc équivalent à ...
Cette précision était of course une mise en garde contre une généralisation de cette expression
Ici l'absence nécessaire de fin de ligne dans la capture est inscrite en filigrane dans l'expression, qui aurait bien sûr demandé d'être tout à fait différente dans un cas contraire
Mais mea culpa effectivement j'aurais dû le préciser, et aussi que le 1er type est plus rapide et économe que le second (bien que ce ne soit pas réellement significatif sur des petits tests comme ça)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [...] StringRegExp

#12

Message par jchd »

Mikell,

Ne te vexe pas mon gros minet, c'était surtout pour mettre en garde des utilisateurs moins expérimentés.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre