[R] Lire TOUT LE TEXTE compris entre des balises

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
DivSar
Niveau 1
Niveau 1
Messages : 2
Enregistré le : ven. 11 janv. 2008 18:44
Status : Hors ligne

[R] Lire TOUT LE TEXTE compris entre des balises

#1

Message par DivSar »

Bonjour, :)
Si on pouvais m'aider, svp !!!! :(

J'ai fait un script qui lit une chaine de caractere dans une variable...

J'arrive a lire la variable mais quand il y a un @CRLF je ne peux la lire.

Au fait ce que je veux c'est lire TOUT LE TEXTE compris entre des balises...
Par exemple:

<aaa> bla bla bla
bla bla bla
</zzz>

Voici le script:

Code : Tout sélectionner

$debut = "<aaa>"
$fin = "</zzz>"
$Texte = "Bla bla<aaa>OK !!! La chaîne à" & @CRLF & " rechercher trouvé</zzz>Blabla"
$pattern = ($debut & "(.*)" & $fin)

$resultat = StringRegExp($Texte, $pattern, 3)
If @error = 0 Then
    ;Chaîne de caractères dans VARIABLE avec retour trouvés
    For $indice = 0 To UBound($resultat) - 1
        MsgBox(0, "Résultat chaîne de caractères avec retour", $resultat[$indice])
    Next
Else
    ;Chaîne de caractères dans VARIABLE avec retour non trouvés
    MsgBox(0, "Résultat avec retour", "Chaîne de caractères dans VARIABLE avec retour non trouvé")
EndIf
J'imagine que c'est le (.*) qui n'est pas correcte,
je sais pas quoi entrer dans l'expression $pattern pour qu'il recherche tout le texte
entre <aaa></zzz>

Merci ...
J'ai essayer toute sorte de combinaison mais j'y arrive pas... :?

Edit Tlem : Merci d'utiliser les balises de code SVP.
codename44
Niveau 4
Niveau 4
Messages : 65
Enregistré le : sam. 22 déc. 2007 15:46
Status : Hors ligne

Re: Lire TOUT LE TEXTE compris entre des balises

#2

Message par codename44 »

salut

voilà ta solution :wink:

Code : Tout sélectionner

$pattern = ($debut & "((?s).*)" & $fin)
explication :

si tu regardes dans l'aide pour "StringRegExp ", dans le tableau "Matching Characters"
en face du "." il est indiqué : "Match any single character (except newline)."

en fait, il fallait rajouter (?s) devant :
(?s) : ". matches anything including newline. (by default "." don't match newline)"

il faut avouer que ce n'est pas évident de trouver comment ça peut bien marcher le (?s), si il faut mettre le point derrière et/ou juste le *
enfin voilà, ça marche ! :D
a+ sur le forum, n'hésites pas à poser des questions !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Lire TOUT LE TEXTE compris entre des balises

#3

Message par Tlem »

Ceci fonctionne aussi !

Code : Tout sélectionner

#include <String.au3>

$debut = "<aaa>"
$fin = "</zzz>"
$Texte = "Bla bla<aaa>OK !!! La chaîne à" & @CRLF & " rechercher trouvé</zzz>Blabla"

$resultat = _StringBetween ($Texte, $debut, $fin)
If @error = 0 Then
    ;Chaîne de caractères dans VARIABLE avec retour trouvés
    MsgBox(0, "Résultat chaîne de caractères avec retour1", $resultat[0])
Else
    ;Chaîne de caractères dans VARIABLE avec retour non trouvés
    MsgBox(0, "Résultat avec retour", "Chaîne de caractères dans VARIABLE avec retour non trouvé")
EndIf
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
DivSar
Niveau 1
Niveau 1
Messages : 2
Enregistré le : ven. 11 janv. 2008 18:44
Status : Hors ligne

Re: Lire TOUT LE TEXTE compris entre des balises

#4

Message par DivSar »

Avec _StringBetween ça fonctionne très bien
Merci beaucoup :D

Pour StringRegExp j'avais essayé toute sorte de combinaison mais je suis novice
et c'est mélangeant.

Avec $pattern = ($debut & "((?s).*)" & $fin)
si je lis dans un fichier et qu'il y a plusieurs <aaa> bla bla </zzz>
il m'affiche completement tout
mais n'arrete pas a chaque <aaa> bla bla </zzz> <aaa> bla bla </zzz>....

Avec _StringBetween tout est OK.

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

Re: [R] Lire TOUT LE TEXTE compris entre des balises

#5

Message par sylvanie »

[edit] :
ce messae est erroné, mais je le laisse pour ne pas casser la chaine de réponse
[fin edit]

Bonsoir,
pour l'expression regulière la plus simple, il s'agit tout smplement de :

Code : Tout sélectionner

$pattern = ($debut & "([?s]*)" & $fin)
 
le . est redondant dans ce cas avec ?s
quant aux parenthèses, elles sont à éviter si le contenus n'est pas intéressant pour la récupératon :

comme ici dans $pattern = ($debut & "((?s).*)" & $fin)
(?s) représente des sous sélections qui peuvent être "parasites" quant il faut trier sur des expresions plus complexes (même si ici ça fonctionne sans problème). parfois on n'a pas le choix quand il s'agit d'associations de mots enchaînées, mais dans ce cas il s'agit d' une sélection d'un même caractère [?s] répété plusieures fois
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
codename44
Niveau 4
Niveau 4
Messages : 65
Enregistré le : sam. 22 déc. 2007 15:46
Status : Hors ligne

Re: [R] Lire TOUT LE TEXTE compris entre des balises

#6

Message par codename44 »

salut

ça ne marche pas pour moi, sans le point (sur son exemple en tous cas) :?:

Code : Tout sélectionner

$pattern = ($debut & "((?s).*)" & $fin) ;=> là j'ai bien le message contenant le résultat de la recherche

$pattern = ($debut & "([?s]*)" & $fin) ;=> là j'ai le message d'erreur comme quoi il n'a rien trouvé
je ne sais pas d'où ça vient cette erreur, as tu une idée ?
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R] Lire TOUT LE TEXTE compris entre des balises

#7

Message par sylvanie »

oulà, j'étais pas bien révéillé, tu as raison, les () de (?s) font parti du symbole, et n'ont pas de rôle de sélection

j'ai dit une bêtise, désolé.
c'est pas la première, et ce sera sûrement pas la dernière ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Répondre