Tiens voila ^^
J'ai fait le truc des parenthèses capturante. Tu vas être content ça fais tout en une fois xD
Il n'y a normalement pas d'API, ce devrait être cross platforme !
Code : Tout sélectionner
ImportC ""
pcre_exec(*pcre,*extra,subject.s,length,startoffset,options,*ovector,ovecsize)
EndImport
Structure List_Extraction
Array Extract.s(0)
EndStructure
Procedure.s BackrefReplaceRegularExpression(regexp_handle, string.s, replacement.s, maximum_reference.l = 10) ; 0 <= maximum_reference <= 99
Static Dim pcre_results(202)
depart = 0
While pcre_exec(PeekL(regexp_handle), 0, string, Len(string), depart, 0, @pcre_results(), 202) > 0
; pcre_exec(PeekL(regexp_handle), 0, string, Len(string), pcre_results(1), 0, @pcre_results(), 202)
rpl.s = replacement
p = pcre_results(0)
q = pcre_results(1)
If FindString(replacement,"$0", 1)
rpl = ReplaceString(rpl, "$0", PeekS(@string + p, q - p))
EndIf
tableau_ref = 2
For _a = 1 To maximum_reference
tag$ = "$" + Str(_a)
If FindString(replacement, tag$, 1)
p1 = pcre_results(tableau_ref)
q1 = pcre_results(tableau_ref + 1)
rpl = ReplaceString(rpl, tag$, PeekS(@string + p1, q1 - p1))
EndIf
tableau_ref + 2
Next
; If FindString(replacement,"\2",1)
; p1=pcre_results(4)
; q1=pcre_results(5)
; rpl=ReplaceString(rpl,"\2",PeekS(@string+p1,q1-p1))
; EndIf
; If FindString(replacement,"\3",1)
; p1=pcre_results(6)
; q1=pcre_results(7)
; rpl=ReplaceString(rpl,"\3",PeekS(@string+p1,q1-p1))
; EndIf
depart = p + Len(rpl)
string = Left(string, p) + rpl + Right(string, Len(string) - q)
Wend
ProcedureReturn string
EndProcedure
Procedure.s BackrefExtractRegularExpression(regexp_handle, string.s, Array Extract.b(1), List Resultat.List_Extraction()) ; 0 <= Taille tableau Extract <= 99
Static Dim pcre_results(202)
depart = 0
maximum_reference = ArraySize(Extract())
ClearList(Resultat())
While pcre_exec(PeekL(regexp_handle), 0, string, Len(string), depart, 0, @pcre_results(), 202) > 0
; pcre_exec(PeekL(regexp_handle), 0, string, Len(string), pcre_results(1), 0, @pcre_results(), 202)
AddElement(Resultat())
Dim Resultat()\Extract(maximum_reference)
p = pcre_results(0)
q = pcre_results(1)
If Extract(0) = #True
Resultat()\Extract(0) = PeekS(@string + p, q - p)
EndIf
tableau_ref = 2
For _a = 1 To maximum_reference
If Extract(_a) = #True
p1 = pcre_results(tableau_ref)
q1 = pcre_results(tableau_ref + 1)
Resultat()\Extract(_a) = PeekS(@string + p1, q1 - p1)
EndIf
tableau_ref + 2
Next
depart = p ; + Len(rpl)
; string = Left(string, p) + rpl + Right(string, Len(string) - q)
string = Left(string, p) + Right(string, Len(string) - q)
Wend
ProcedureReturn string
EndProcedure
REGEX$ = " t(.*?)e(.*?) "
rh = CreateRegularExpression(0, REGEX$)
CHAINE$ = "As they functions tried importing them through the tset "
Debug "#### Test de remplacement Recurrent :"
Debug ""
Debug "Chaine de départ :"
Debug CHAINE$
Debug "Regex = ||" + REGEX$ + "||"
Debug ""
Debug "Résultat :"
Debug BackrefReplaceRegularExpression(rh, CHAINE$, "________$0")
Dim tableau_extraction.b(2)
NewList Result.List_Extraction()
For a = 0 To 2
tableau_extraction(a) = #True
Next
BackrefExtractRegularExpression(rh, CHAINE$, tableau_extraction(), Result())
Debug ""
Debug ""
Debug "#### Test d'extraction Recurrente :"
Debug ""
Debug "Chaine de départ :"
Debug CHAINE$
Debug "Regex = ||" + REGEX$ + "||"
Debug ""
Debug "Valeurs extraites :"
Debug ""
b = 0
ForEach Result()
Debug "Occurence " + Str(b)
For a = 0 To 2
Debug "$" + Str(a) + " = " + Result()\Extract(a)
Next
b + 1
Next
Donc avec ta regex et ta chaine à tester ça donnerais :
Code : Tout sélectionner
;{ Lib Backref Replace / Extract
ImportC ""
pcre_exec(*pcre,*extra,subject.s,length,startoffset,options,*ovector,ovecsize)
EndImport
Structure List_Extraction
Array Extract.s(0)
EndStructure
Procedure.s BackrefReplaceRegularExpression(regexp_handle, string.s, replacement.s, maximum_reference.l = 10) ; 0 <= maximum_reference <= 99
Static Dim pcre_results(202)
depart = 0
While pcre_exec(PeekL(regexp_handle), 0, string, Len(string), depart, 0, @pcre_results(), 202) > 0
; pcre_exec(PeekL(regexp_handle), 0, string, Len(string), pcre_results(1), 0, @pcre_results(), 202)
rpl.s = replacement
p = pcre_results(0)
q = pcre_results(1)
If FindString(replacement,"$0", 1)
rpl = ReplaceString(rpl, "$0", PeekS(@string + p, q - p))
EndIf
tableau_ref = 2
For _a = 1 To maximum_reference
tag$ = "$" + Str(_a)
If FindString(replacement, tag$, 1)
p1 = pcre_results(tableau_ref)
q1 = pcre_results(tableau_ref + 1)
rpl = ReplaceString(rpl, tag$, PeekS(@string + p1, q1 - p1))
EndIf
tableau_ref + 2
Next
; If FindString(replacement,"\2",1)
; p1=pcre_results(4)
; q1=pcre_results(5)
; rpl=ReplaceString(rpl,"\2",PeekS(@string+p1,q1-p1))
; EndIf
; If FindString(replacement,"\3",1)
; p1=pcre_results(6)
; q1=pcre_results(7)
; rpl=ReplaceString(rpl,"\3",PeekS(@string+p1,q1-p1))
; EndIf
depart = p + Len(rpl)
string = Left(string, p) + rpl + Right(string, Len(string) - q)
Wend
ProcedureReturn string
EndProcedure
Procedure.s BackrefExtractRegularExpression(regexp_handle, string.s, Array Extract.b(1), List Resultat.List_Extraction()) ; 0 <= Taille tableau Extract <= 99
Static Dim pcre_results(202)
depart = 0
maximum_reference = ArraySize(Extract())
ClearList(Resultat())
While pcre_exec(PeekL(regexp_handle), 0, string, Len(string), depart, 0, @pcre_results(), 202) > 0
; pcre_exec(PeekL(regexp_handle), 0, string, Len(string), pcre_results(1), 0, @pcre_results(), 202)
AddElement(Resultat())
Dim Resultat()\Extract(maximum_reference)
p = pcre_results(0)
q = pcre_results(1)
If Extract(0) = #True
Resultat()\Extract(0) = PeekS(@string + p, q - p)
EndIf
tableau_ref = 2
For _a = 1 To maximum_reference
If Extract(_a) = #True
p1 = pcre_results(tableau_ref)
q1 = pcre_results(tableau_ref + 1)
Resultat()\Extract(_a) = PeekS(@string + p1, q1 - p1)
EndIf
tableau_ref + 2
Next
depart = p ; + Len(rpl)
; string = Left(string, p) + rpl + Right(string, Len(string) - q)
string = Left(string, p) + Right(string, Len(string) - q)
Wend
ProcedureReturn string
EndProcedure
;}
REGEX$ = "^HTTP.+\s(([0-9])[0-9][0-9])\s"
CHAINE$ = "HTTP/1.1 200 OK"
RegHandle = CreateRegularExpression(0, REGEX$)
; on crée le tableau pour extraire les parenthèses que l'on veux
Dim Tableau_Extraction.b(2)
; on n'oublie pas de paramétrer le tableau !!
For a = 1 To 2 ; on ne met pas 0 car on n'a pas besoin de $0
Tableau_Extraction(a) = #True
Next
; on crée la liste pour récupérer les résultats
NewList Resultat.List_Extraction()
; effectue l'extraction :
BackrefExtractRegularExpression(RegHandle, CHAINE$, Tableau_Extraction(), Resultat())
; on affiche les resultats :
Debug "Chaine de départ :"
Debug CHAINE$
Debug "Regex = ||" + REGEX$ + "||"
Debug ""
Debug "Valeurs extraites :"
Debug ""
b = 0
ForEach Resultat()
Debug "Occurence " + Str(b)
For a = 0 To ArraySize(Resultat()\Extract())
Debug "$" + Str(a) + " = " + Resultat()\Extract(a)
Next
b + 1
Next
Et voila ^^