Page 1 sur 1

[R] Lire TOUT LE TEXTE compris entre des balises

Posté : ven. 11 janv. 2008 20:17
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.

Re: Lire TOUT LE TEXTE compris entre des balises

Posté : ven. 11 janv. 2008 21:50
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 !

Re: Lire TOUT LE TEXTE compris entre des balises

Posté : ven. 11 janv. 2008 22:02
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

Re: Lire TOUT LE TEXTE compris entre des balises

Posté : ven. 11 janv. 2008 22:22
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... :)

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

Posté : ven. 11 janv. 2008 23:00
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

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

Posté : ven. 11 janv. 2008 23:24
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 ?

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

Posté : sam. 12 janv. 2008 13:20
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 ^^