[R] StringRegExp

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

[R] StringRegExp

#1

Message par lesolutionneur »

Bonjour tout le monde, j'ai un petit problème sur lequel je sèche et donc vous demande une petite aide :P :

Code : Tout sélectionner

HTML = _IEDOCREADHTML($IEOBJ)
$HTML = StringRegExpReplace ($HTML, "<div class={"}subject{"}>[a-zA-Z0-9]</div>", "."
Mon code est très certainement foireux donc je vous explique que je veux faire :

Si on trouve <div class="subject">--nimporte quel caracyères y compris les &, les ! ... </div>, alors on remplace ça par ".".

Le problème est que je ne sais pas comment dire "n'importe quel caractère" ni comment faire que les guillmets ne soient pas interprétées comme la fin de la chaine (j'ai mis {"} mais j'en suis pas sûr.

Merci beaucoup !
Modifié en dernier par lesolutionneur le mar. 03 janv. 2012 19:20, modifié 1 fois.
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..]StringRegExp

#2

Message par DimVar »

Bonjour,

Pour les caractères, je pense que tu trouveras la réponse dans l'aide de StringRegExp .
Pour les guillemets, entre simple quote peut être ?


Cdlt.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..]StringRegExp

#3

Message par lesolutionneur »

Je n'ai justement pas compris la doc, j'ai pas trouvé un endroit où on dit n'importe quel caractère entre ça et ça.

Ce que j'aimerais, c'esy que quelqu'un repenne exactement mon code et le corrige de façon à ce que ça fasse ce que j'ai dit dans mon 1er message.

Merci !
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..]StringRegExp

#4

Message par sylvanie »

lesolutionneur a écrit : Le problème est que je ne sais pas comment dire "n'importe quel caractère" ni comment faire que les guillmets ne soient pas interprétées comme la fin de la chaine (j'ai mis {"} mais j'en suis pas sûr.
Pour le premier point (et c'est le cas de le dire :mrgreen: ):

Code : Tout sélectionner

. Match any single character (except newline).
Pour le double quotage on a 2 cas de figure :
1) il n'y a pas de mélange de " et ' dans l'expression
C'est le cas simple : on utilise ' pour encadrer l'expression, et " devient un caractère parmis les autres
2) il y a mélange et là il faut passer par le code ascii de " et ' respectivement \x22 et \x27

Maintenant pour réaliser votre demande, il faut utiliser les () afin de faire ce qu'on appelle du backward Replace
C'est à dire qu'on fait des sélections, que l'on peut réutiliser en replace grâce à des variables génériques gérées par stringregexpreplace : $1,$2 ....

ce qui nous fait concrètement :

Code : Tout sélectionner

$text='<div class="subject">blablabla</div>'

$filtre=StringRegExpReplace($text,'(<div class="subject">)[\w]+(</div>)','"${1}...${2}')
ConsoleWrite($filtre&@CRLF)
 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..]StringRegExp

#5

Message par Iste »

Je dirais même plus

Code : Tout sélectionner

$text='<div class="subject">blablabla</div>'

$filtre=StringRegExpReplace($text,'[color=#FF0000](?s)[/color](<div class=").+?(</div>)','"${1}...${2}')
ConsoleWrite($filtre&@CRLF)
Car entre le debut et la fin d'une div, ya souvent des retours a la ligne

edit : petite erreur
Signez ici
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..]StringRegExp

#6

Message par sylvanie »

ça compte pas ! c'était pas dans l'énoncé :P

Elle est super cette remarque car elle complète un des dernier posts que j'ai fait sur les regexp Merci
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..]StringRegExp

#7

Message par matwachich »

Code : Tout sélectionner

$s = '<div class="subject">blablabla' & @CRLF & 'blablabla</div>'

$r = StringRegExpReplace($s, '(?s)(<div class="subject">).*(</div>)', '${1}.${2}')
ConsoleWrite($r & @CRLF)

$r = StringRegExpReplace($s, '(?s)(<div class="subject">.*</div>)', '.')
ConsoleWrite($r & @CRLF)
 
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..]StringRegExp

#8

Message par lesolutionneur »

merci tout le monde !

J'essaie et je vous tiens au courant ;)
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

#9

Message par jchd »

@iste
Attention, (?s) est l'option DOTALL qui fait avaler les fins de lignes (selon réglage en vigueur) par un métacaractère dot .
Tu voulais plutôt \s*

En général, la remarque de Iste est pertinente : beaucoup de gros "serveurs" sont susceptibles de balancer des suites d'espacements (horizontaux et/ou verticaux) en plein milieu d'à peu près n'importe quoi.

Je connais même des services où ce phénomène apparaît même en rafaîchissant une page à deux secondes d'intervalle. Donc si on veut se prémunir efficacement et durablement contre ça, on est amené à mettre \s*\v* entre _chaque_ élément, ce qui devient vite indémerdable.

EDIT : argh, mal lu l'affichage débile que j'avais.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..]StringRegExp

#10

Message par lesolutionneur »

j'avoue ne pas avoir trop compris ce que tu disais ^^
je suis un débutant un regex ;)

Ps: ça sert à quoi consoleWrite() ?
Pss: peux-tu me pondre le code qui selon toi est le mieux pour éviter les envois de retour chariots du serveur
Modifié en dernier par lesolutionneur le ven. 09 déc. 2011 17:38, modifié 1 fois.
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..]StringRegExp

#11

Message par zeshrek »

lesolutionneur a écrit :Ps: ça sert à quoi consoleWrite() ?
la touche F1 est ton amie !
Si vis pacem para bellum
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..]StringRegExp

#12

Message par lesolutionneur »

Je ne sais pas quoi çà sert mais de toute façon, là, je suis sur iPod touch. (ou alors, c'est pour ouvrir une console autoit ?)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..]StringRegExp

#13

Message par sylvanie »

Autoit sur Ios , fallait la faire celle là ! :lol:
Bon et bien consolewrite c'est pour écrire sur la console stdout. Donc via scite, c'est la partie basse de l'éditeur et en fenêtre DOS, c'est simplement la console (sous réserve de compilation en mode non GUI), et ça marche sur d'autre console. ...
Pour la pertinence de "quel est le meilleur code", testez au moins les différentes propositions sur vos cas d'application pour vous faire une idée, car en regexp, il y a pas mal d'expressions candidates pour un problème et dire quelle est la meilleure d'entre elle c'est toujours délicat.
Vue ce qui a été dit, partez plutôt sur celles de Iste ou matwachich car la mienne ne gère pas les lignes coupées.
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..]StringRegExp

#14

Message par lesolutionneur »

Merci, je testerais lundi (mon pc a IE9 et ie.au3 ne marche pas avec IE 9, je serais ravi si vous pouviez me donner une
solution !)
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..] StringRegExp

#15

Message par lesolutionneur »

$text='<div class="subject">blablabla</div>'

$filtre=StringRegExpReplace($text,'(?s)(<div class=").+?(</div>)','"${1}...${2}')
ConsoleWrite($filtre&@CRLF)
Il y a un problème : déjà, il ne faut remplacer que si il y a : <div class="subject"

Le problème, c'est que il peut être en plusieurs fois, et je veux donc le laisser en plusieurs fois le cas échéant.

Donc mon code devrait donner ça, non ?

Code : Tout sélectionner

$text = je mettrais mon texte après
while @error = 0
$text=StringRegExpReplace($text,'(<div class="subject").+?(</div>)','"${1}...${2}')
ConsoleWrite($filtre&@CRLF)
Wend
 

Corrigez-moi si je me trompe, d'ailleurs, j'ai enlevé le (?s), ai-je raison ?


Je reéxplique le principe : j'ouvre un fichier, je remplace toutes les occurences de <div class="subject" du texte, des balises, blablabla </div>

Il peut y avoir plusieurs fois ce truc, et donc, il faut les remplacer tous.
Si <div class= "autre chose" alors faut pas remplacer d'où le <div class="subject"

merci beaucoup !


Ps: et ça sert à quoi les

Code : Tout sélectionner

'${1}.${2}'
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] StringRegExp

#16

Message par sylvanie »

Bonjour
Par défaut Stringregexpreplace remplace toutes les occurrences trouvées donc de ce côté vous êtes tranquille.
Pour l'ajout de "subject" dans la pattern de recherche, oui il le faut, vous l'avez bien expliqué.
par contre la suppression du (?) vous expose au problème soulevé qu'une directive <div> est souvent découpée avec des retours chariots. Et donc si vous en avez dans votre source, il ne seront pas traîté (c'était le cas de mon expression).

Pour les ${1} ${2} il s'agit des backward référence de remplacement dont je parlais dans mon 1er post. $1 et ${1} sont 2 syntaxes similaires acceptées. Elles représentent les sélections faites avec des parenthèses qu'on réutilise dans le remplacement.

ici ${1} va vous recopier
<div class="subject"
et ${2}
</div>

c'est uns des chose les plus intéressantes dans les regexp, car ceci permet par exemple de faire des déplacement de texte.

Par exemple si vous avez un fichier de plusieurs ligne composées d'un nom puis de chiffres et que vous devez les inverser les 2 composantes:
toto 1234
tata 565
pour en faire
1234 toto
565 tata

vous faite un :
stringregexpreplace($texte_originale,"([a-z]+) (\d+)","${2} ${1}")
et vous avez traité tout votre fichier d'un coups
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..] StringRegExp

#17

Message par lesolutionneur »

merci de ta réponse mais en fait, je ne veux pas les inverser mais les remplacer par "." donc pas de ${1} ni ${2} non ?

donc je dois mettre '1', non ?
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

#18

Message par jchd »

Concernant (?s) voir les propos déjà postés à ce sujet dans ce fil. Tu lis ce qu'on écrit, des fois ?

Un site peut parfaitement t'envoyer
< LF LF TAB div CR LF TAB TAB class TAB = ........
Dans ton butineur ça donnera le même résultat, mais ta regexp part à dame.

Il y a un " parasite dans la partie remplacement de ton extrait de code.

${1} est équivalent à $1 et désigne le contenu de la premère capture de la regexp. $2 la seconde, etc.

Pour IE9, utiliser la beta.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] StringRegExp

#19

Message par sylvanie »

J'avais bien compris que vous ne vouliez pas inverser, c'était un exemple d'utilisation ... :roll:

ce que vous voullez visiblement c'est remplacer ce qu'il y a entre les deux chaînes.
Donc Vous êtes obligé de les reprendre dans votre remplacement
Si on reprend ce que vous avez mis en le modifiant un peu on a :

Code : Tout sélectionner

$text = tout le texte buffurisé
$filtre  =StringRegExpReplace($text,'(?s[color=#40BF00])(<div class="subject")[/color][color=#FF4000].+[/color][color=#0040FF](</div>)[/color]','"[color=#40BF00]${1}[/color][color=#FF4000]Nouveau_texte[/color][color=#0040FF]${2}[/color]')
ConsoleWrite($filtre&@CRLF)
Wend
 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] StringRegExp

#20

Message par matwachich »

Est-ce-que vous avez au moins essayé les exemples (le premier surtout) que je vous ai donné!!!??? :roll:
Il font ce que vous demandez.
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Répondre