Page 1 sur 2

Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 17:38
par Chris
J'ai besoin d'un coup de main. :roll:

Avec une expression régulière, comment extraire une chaine qui est entre deux balises?
J'ai essayé tout un tas de trucs, je dois être très con, (je sais que certains en sont même convaincus :mrgreen:), mais j'arrive à rien avec ces foutues expressions régullières.


Voilà une chaine pour l'exemple :

Code : Tout sélectionner

n$ = "<strong>ABCDEFGHIJ</strong>"
Je veux récupérer ce qu'il y a entre les balises, (mais sans les balises, évidemment), c'est à dire uniquement "ABCDEFGHIJ".

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 19:16
par Guimauve
Juste comme ça, est-ce que c'est suffisant ?

Code : Tout sélectionner

n$ = "<strong>ABCDEFGHIJ</strong>"
Debug StringField(StringField(n$, 2, ">"), 1, "<")
A+
Guimauve

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 19:29
par Chris
Il fallait bien qu'il y en ait au moins un qui réponde à côté de la plaque!

C'est toi le gagnant! :mrgreen:

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 19:52
par Guimauve
Chris a écrit :Il fallait bien qu'il y en ait au moins un qui réponde à côté de la plaque!

C'est toi le gagnant! :mrgreen:
C'est à dire ? Non attend, tu tiens absolument à te faire chi... avec les expression régulière !!!
N'ayons pas peur des mots, un titre du genre
Expressions régulières (de m.....)
moi je l'interprète comme suit:
Expression Régulière de MERDE

Sérieusement, tu considère le truc comme de la véritable merde mais tu veux continuer de l'utiliser et après ça c'est moi l'andouille qui répond à coté de la plaque.

WOW !!! BRAVO CHAMPION !

A+
Guimauve

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 19:56
par Chris
Avec une expression régulière, comment extraire une chaine qui est entre deux balises?
Désolé, mais si tu ne sais pas lire, je ne peux rien faire pour toi.

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 20:06
par case
c'est prise de tête quand même

Code : Tout sélectionner

n$ = "<strong>ABCDEFGHIJ</strong>"
exp=CreateRegularExpression(#PB_Any,"(<[[:alnum:]]*>)|(</[[:alnum:]]*>)")
Debug ReplaceRegularExpression(exp,n$,"")
FreeRegularExpression(exp)

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 20:15
par Chris
Alors là, Image

Pile-poil ce que je cherchais. Merci. :wink:

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 20:23
par G-Rom
@Case
Elle est foireuse ta regex :D
n$ = "<strong>ABCDEFGHIJ</stronsssssssg>"
exp=CreateRegularExpression(#PB_Any,"(<[[:alnum:]]*>)|(</[[:alnum:]]*>)")
Debug ReplaceRegularExpression(exp,n$,"")
FreeRegularExpression(exp)

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 20:32
par case
pourquoi ? :) elle fonctionne pourtant...

mais j'avoue que j'ai pas tout compris...

Re: Expressions régulières (de m.....)

Publié : ven. 15/avr./2011 20:33
par Chris
Elle fonctionne très bien sa regex.

J'ai essayé de modifier les balises, ça marche quand même.
De toute manière, ça va servir à extraire des données dans une page web. Il y a peu de chance que les balises soient mal orthographiées. :wink:

Re: Expressions régulières (de m.....)

Publié : lun. 18/avr./2011 19:12
par Geo Trouvpatou
Salut.

@Case

1) Pourquoi des doubles [[ et ]]
2) A quoi correspond le *
3) A quoi correspond le |

Parce que je doit t'avouer que pour extraire un mot entre du bbcode, pour les truc simples, j'utilise la même méthode que Guimauve.

Pour le 1 si c'est pour échapper le 1er [, moi j'utilise le \.
C'est mon problème, autant en php je peux faire une regex simplète, qu'en PB je galère.

[EDIT] Chez moi aussi cela fonctionne bien, c'est peut-être sous Linux que ça déconne ?

Re: Expressions régulières (de m.....)

Publié : lun. 18/avr./2011 19:27
par case
parce qu’en fait les [:alnum:] c'est un peu comme des mots deja définis ou des fonctions.

enfin j'y connais rien en expressions régulières et j'y comprend pas grand chose ,)

si G-rom me dit qu'elle sent le pâté la mienne je veux bien le croire sur parole :mrgreen:

edit
elle fonctionne mais elle n'est pas fiable. dans le sens ou elle extrait le contenu entre balises même si les balises sont différentes

exemple

<strong> blablabla </bouh> ca marche quand même ... alors que normalement on devrais vérifier que la balise suivante est bien </strong>

ça doit être faisable mais j'y connais rien du tout je le répète :)

Re: Expressions régulières (de m.....)

Publié : lun. 18/avr./2011 20:20
par Geo Trouvpatou
Ok, j'ai compris où voulais en venir G-Rom.

Bah en faisant ça alors :

Code : Tout sélectionner

n$ = "<strong>ABCDEFGHIJ</strong>"
exp=CreateRegularExpression(#PB_Any,"<strong>|</strong>")
Debug ReplaceRegularExpression(exp,n$,"")
FreeRegularExpression(exp)
Personnellement je m'étais toujours demandé comment dire : Trouve-moi ce qu'il y a entre <strong> et </strong>, ben apparemment c'est justement le Pipe.
J’essayais avec $1 et \\1 à la place de | et cela ne fonctionnait pas.

J'ai donc appris un nouveau truc.
@Case, tu l'as trouvé où ce code ?

[Edit]Mon code ne fonctionne plus si : <strong>ABCDEFGHIJ</STRONG>
Faut trouver comment signifier de ne pas respecter la casse.

Re: Expressions régulières (de m.....)

Publié : lun. 18/avr./2011 21:13
par G-Rom
Voici un exemple qui marche :

Code : Tout sélectionner

Procedure.s ExtractFromBalise(text.s, open.s, close.s)
      PosA = FindString(text,open,1) + Len(open)
      PosB = FindString(text,close,2)
      Out$ = Mid(text,PosA,PosB-PosA)
      ProcedureReturn Out$
EndProcedure



REGEX_MASK_H_1_6$     = "<h([1-6])>([^<]*)</h([1-6])>"
REGEX_MASK_STRONG$    = "<strong>([^<]*)</strong>"
REGEX_MASK_PROCEDURE$ = "Procedure([^<]*)\)"




n$ = "<h1>Ceci est une Balise foireuse</hx>"
n$ + "<h1>Ceci est un titre !!!!!</h1>"
n$ + "<strong>DUR COMME MA BYTE!</strong>"
n$ + "<strong>DUR COMME MA BYTE! 2X</strong>"
n$ + "<BaliseFoireuse>DUR COMME MA BYTE!</BaliseFoireuse>"
n$ + "Prcocedure Test(A.f)"
n$ + "Procedurdes Floo(A.f)"
n$ + "Procedure Floo(A.f)"



;-Extraction des titres :
exp = CreateRegularExpression(#PB_Any,REGEX_MASK_H_1_6$)
Dim Titre$(0)
TitreFound = ExtractRegularExpression(exp,n$, Titre$())
FreeRegularExpression(exp)

;-Extraction des strong :
exp = CreateRegularExpression(#PB_Any,REGEX_MASK_STRONG$)
Dim Strong$(0)
StrongFound = ExtractRegularExpression(exp,n$, Strong$())
FreeRegularExpression(exp)   

;-Extraction des procedures :
exp = CreateRegularExpression(#PB_Any,REGEX_MASK_PROCEDURE$)
Dim Proc$(0)
ProcFound = ExtractRegularExpression(exp,n$, Proc$())
FreeRegularExpression(exp)   





Debug "TITRE VALIDE :"
For k = 0 To TitreFound-1
  Debug "- "+ExtractFromBalise(Titre$(k),"<h1>","</h1>")
Next
Debug "STRONG VALIDE :"
For k = 0 To StrongFound-1
  Debug "- "+ExtractFromBalise(Strong$(k),"<strong>","</strong>")
Next
Debug "PROC VALIDE :"
For k = 0 To ProcFound-1
  Debug "- "+Proc$(k)
Next


Dès lors que l'on fait du parsing d'une source , en règle générale , pour se simplifier la vie , on met la source en minuscule ou en majuscule.

Re: Expressions régulières (de m.....)

Publié : mar. 19/avr./2011 8:37
par blendman
super ces exemples !
Merci :D