Page 1 sur 2
[R] StringRegExp
Posté : ven. 09 déc. 2011 11:34
par lesolutionneur
Bonjour tout le monde, j'ai un petit problème sur lequel je sèche et donc vous demande une petite aide

:
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 !
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 11:54
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.
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 12:07
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 !
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 15:06
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

):
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)
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 15:07
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
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 15:14
par sylvanie
ça compte pas ! c'était pas dans l'énoncé
Elle est super cette remarque car elle complète un des dernier posts que j'ai fait sur les regexp Merci
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 15:20
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)
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 15:22
par lesolutionneur
merci tout le monde !
J'essaie et je vous tiens au courant

Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 15:25
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.
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 17:31
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
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 17:32
par zeshrek
lesolutionneur a écrit :Ps: ça sert à quoi consoleWrite() ?
la touche F1 est ton amie !
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 17:41
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 ?)
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 18:34
par sylvanie
Autoit sur Ios , fallait la faire celle là !
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.
Re: [..]StringRegExp
Posté : ven. 09 déc. 2011 18:42
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 !)
Re: [..] StringRegExp
Posté : lun. 12 déc. 2011 14:20
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
Re: [..] StringRegExp
Posté : lun. 12 déc. 2011 14:48
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
Re: [..] StringRegExp
Posté : lun. 12 déc. 2011 14:58
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 ?
Re: [..] StringRegExp
Posté : lun. 12 déc. 2011 15:16
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.
Re: [..] StringRegExp
Posté : lun. 12 déc. 2011 15:17
par sylvanie
J'avais bien compris que vous ne vouliez pas inverser, c'était un exemple d'utilisation ...
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
Re: [..] StringRegExp
Posté : lun. 12 déc. 2011 18:01
par matwachich
Est-ce-que vous avez au moins essayé les exemples (le premier surtout) que je vous ai donné!!!???
Il font ce que vous demandez.