FindWithJoker : une version étendue de FindString

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

FindWithJoker : une version étendue de FindString

Message par ZapMan »

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
Il y a sûrement des améliorations à faire, mais bon, ça répond à mes besoins pour le moment.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Bon Boulot et super utile ;)
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Clair que c'est très utile.
Merci Zapman :)
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

Content que ça vous plaise, les gars. Et merci de me rapporter des éventuels disfonctionnements.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
Répondre