Code : Tout sélectionner
Procedure FindWithJoker (Text$,SearchStr$,posdep)
; By Zapman
;
; Cette fonction de recherche apporte quelques fonctionnalités supplémentaires par
; rapport à la fonction FindString :
;
; - les minuscules et majuscules sont équivalentes
; Ex : FindWithJoker ("Exemple de chaine","exemple",0) retourne 1
;
; - SearchStr$ peut contenir plusieurs chaines de recherches séparées par le caractère |
; Ex : FindWithJoker ("Chaine dans laquelle on fait la recherche","voiture|laquelle",0) retournera la position de "laquelle"
;
; - Si l'une des chaines incluses dans SearchStr$ est précédée du caractère !, une correspondance exacte sera recherchée
; Ex : FindWithJoker ("Exemple","voiture|!exemple",0) retournera 1
; FindWithJoker ("Un exemple","voiture|exemple",0) retournera 4
; FindWithJoker ("Un exemple","voiture|!exemple",0) retournera 0
; Cette dernière recherche est équivalente à : Findstring(Text$,"voiture",0) or Text$ = "exemple"
;
; - SearchStr$ peut contenir 2 types de caractère joker : le # et le @
; le # peut remplacer n'importe quel nombre
; Ex : ("Exemple N°86 de chaine","Exemple N°# de chaine",0) retournera 1
; le @ peut remplacer n'importe quel chaine
; Ex : ("Exemple de chaine","Exemple @ chaine",0) retournera 1
; Ex : ("Exemple de chaine","!Exemple @ chaine",0) retournera 1
; Ex : ("Exemple de chaine","Exemple @",0) retournera 1
; Ex : ("Exemple de chaine","!Exemple @",0) retournera 1
; Ex : ("Exemple de chaine de caractère","Exemple @ chaine",0) retournera 1
; Ex : ("Exemple de chaine de caractère","!Exemple @ chaine",0) retournera 0
; Ex : ("Exemple de chaine de caractère","Exemple|!Exemple @ chaine",0) retournera 1
If SearchStr$ And Text$
SearchStr$ = LCase(SearchStr$)
Text$ = LCase(Text$)
If posdep = 0 : posdep = 1 : EndIf
While SearchStr$ And Result = 0
p = FindString(SearchStr$,"|",0) : If p = 0 : p = Len(SearchStr$)+1 : EndIf
TSearchStr$ = Left(SearchStr$,p-1)
SearchStr$ = Right(SearchStr$,Len(SearchStr$)-p)
If Left(TSearchStr$,1)="!" ; on doit rechercher la valeur exacte
TSearchStr$=Right(TSearchStr$,Len(TSearchStr$)-1)
Exact = 1
Else
Exact = 0
EndIf
;
pl = posdep
start = pl
Repeat
p = 0
Repeat
mp = p+1
p = FindString(TSearchStr$,"#",mp) ; #remplace n'importe quel caractère numérique :
; Avec TSearchStr$ = "-#.htm" et Text$ = "Mapage-18.htm" Result vaudra 7
p2 = FindString(TSearchStr$,"@",mp); @remplace n'importe quel suite de caractères :
; Avec TSearchStr$ = "-@.htm" et Text$ = "Mapage-w.htm" Result vaudra 7
If p2 And (p2<p Or p=0) : p = p2 : EndIf
If p = 0 : p = Len(TSearchStr$)+1 : EndIf
mpl = pl ;
If mp<Len(TSearchStr$) Or p<>mp
pl = FindString(Text$,Mid(TSearchStr$,mp,p-mp),pl)
Else
pl = Len(Text$)+1
EndIf
If mp = 1
mstart = start
start = pl
EndIf
If pl And mpl>mstart
joker$ = Mid(Text$,mpl,pl-mpl)
joker$ = ReplaceString(joker$,"0","1")
If Str(Val(joker$))<>joker$ And msep$ <> "@"
pl = 0
Else
pl + p - mp
EndIf
Else
If Exact And pl>1 And Trim(Left(Text$,pl-1)) : pl = 0 : EndIf
If pl : pl + p - mp : EndIf
EndIf
If p2 = p : msep$ = "@" : Else : msep$ = "#" : EndIf
Until p = Len(TSearchStr$)+1 Or pl = 0
If Exact And pl<=Len(RTrim(Text$)) : pl = 0 : EndIf
If pl : Result = start : EndIf
If start : start + 1 : EndIf
pl = start
Until start = 0 Or start > Len(Text$) Or Result Or Exact
Wend
EndIf
ProcedureReturn Result
EndProcedure