[Func] _StringBetween2String()

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

[Func] _StringBetween2String()

#1

Message par PandiPanda »

La fonction:

Code : Tout sélectionner

Func _StringBetween2String($String,$StringDebut,$StringFin,$caseSense=False)
    If ((IsString($String) And IsString($StringDebut) And IsString($StringFin)) And IsBool($caseSense)) Then
        Local $case=0
        If $caseSense Then
            $case=1
        EndIf
        If $StringDebut = "" Then
            Return StringMid ($String,1,(StringInStr($String,$StringFin,$case,1))-1)
        ElseIf $StringFin = "" Then
            Return StringMid ($String,(StringInStr($String,$StringDebut,$case))+StringLen($StringDebut))
        Else
            Local $debut=StringInStr($String,$StringDebut,$case)
            If @error = 0 Then
                Local $fin=StringInStr($String,$StringFin,$case,1,$debut)
                If $fin <> $debut Then
                    Local $realDebut=$debut+StringLen($StringDebut)
                    Return StringMid($String,$realDebut,$fin-$realDebut)
                EndIf
            EndIf
        EndIf
    EndIf
    SetError(1);erreur parametre
    Return ""
EndFunc
Que fait cette fonction? Quels sont les paramètre ?

Code : Tout sélectionner

#cs ----------------------------------------------------------------------------
 AutoIt Version : 3.3.6.0
 Auteur:         Pandi_Panda

 Fonction du Script :
     #_StringBetween2String($String,$StringDebut,$StringFin,$caseSense=False)
         @FONCTION:
            > permet d'extirper un String entre 2 string, servant de delimiteur.
         @PARAM
            > $String ; est le string Principal, contenant tout.
            > $StringDebut ; est le 1er string delimiteur. [si $StringDebut="" alors on extirpe du debut jusque $StringFin]
            > $StringFin ; est le second strign delimiteur.[si $StringFin=""  alors, on extirpe depuis le $StringDebut jusque la fin]
            > $caseSense ; si on veux avec case Sensitive ou pas. [true si oui; false si non]
         @RETURN
            > return le string se situant entre les 2 String delimiteur. [si erreur retourne "" [rien]]
         @ERROR
            > @ERROR=1 si erreur de parametre.
#ce ----------------------------------------------------------------------------
Exemple d'utilisation:

Code : Tout sélectionner

$String="<lol>Test Du Panda :D "&@CRLF&"#Pandaaaaaaaa#</LOL>"&"</lol>"
$StringDebut="<lol>"
$StringFin="</lol>"

MsgBox(0,"",_StringBetween2String($String,$StringDebut,$StringFin))
$StringFin=""
MsgBox(0,"",_StringBetween2String($String,$StringDebut,$StringFin))
$StringDebut=""
$StringFin="</lol>"
MsgBox(0,"",_StringBetween2String($String,$StringDebut,$StringFin,True))
$StringFin="</LOL>"
MsgBox(0,"",_StringBetween2String($String,$StringDebut,$StringFin,True))
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [Func] _StringBetween2String()

#2

Message par mikell »

Heu quelle est la différence ?
Fichier d'aide a écrit :

Code : Tout sélectionner

_StringBetween 
--------------------------------------------------
Returns the string between the start search string and the end search string.

#Include <String.au3>
_StringBetween($s_String, $s_Start, $s_End [, $v_Case = -1])
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [Func] _StringBetween2String()

#3

Message par PandiPanda »

hmmm Pas grand chose en fait, sauf ceci peut être ...

_StringBetween() :

Code : Tout sélectionner

Local $T0=TimerInit()
Local $narray=_StringBetween($String,$StringDebut,$StringFin)
MsgBox(0,'',TimerDiff($T0))
RESULTAT: Image


_StringBetween2String() :

Code : Tout sélectionner

Local $T0=TimerInit()
Local $narray=_StringBetween2String($String,$StringDebut,$StringFin)
MsgBox(0,'',TimerDiff($T0))
RESULTAT: Image

Hors mis ceci, je dirai que j'ai repris ce bout de code que j'ai réecris pour rien, il semblerait :p

[A delete]
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] _StringBetween2String()

#4

Message par Tlem »

PandiPanda a écrit :hmmm Pas grand chose en fait, sauf ceci peut être ...
Comme rien n'est parfait dans le meilleur des mondes, il aurait été intéressant avant de suggérer la supériorité en vitesse d'exécution de votre fonction, de faire des tests répétitifs, car sur une seule exécution, cela n'a pas de sens.

Essayez donc le code ci-dessous et vous constaterez que finalement, la fonction _StringBetween() est 0.10 s plus rapide que la votre ^^ :
► Afficher le texte
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [Func] _StringBetween2String()

#5

Message par ZDS »

Bonjour,

Désolé de contredire ton script Tlem, mais tu as oublié de réinitialiser le $TMax à 0 au début de la seconde boucle, ce qui fait que le résultat affiché pour _StringBetween2String() contient le précédent avec.

Il n'en reste pas moins que sur une machine de guerre (genre supériorité nucléaire ^^) le temps d'exécution sur une chaine de caractères assez longue (environ 51200 caractères) est complètement différent : entre 2.5 et 2.7 secondes pour _StringBetween(), et seulement 0.38s pour _StringBetween2String() !!!

Miracle? Non pas vraiment, car là où _StringBetween() affiche tous les résultats (environ 1.000), _StringBetween2String() quand à elle n'en trouve qu'un seul, le premier.

En bref, les deux fonctions n'ont rien à voir l'une avec l'autre au final. Ce qui n'empêche pas de trouver une utilité contestable à cette nouvelle fonction, car ne récupérer qu'un résultat serait utile si on connaissait son emplacement dans la chaine, et si elle pouvait être paramétrée genre "je veux le résultat n°i". Bah oui, il n'y a pas toujours qu'un seul jaune dans un oeuf.

A bientôt.

EDIT: J'ai amélioré le code pour tester ce système d'offset de départ. Et (toujours comparé aux 2.5/2.7 secondes), on se retrouve avec les 1.000 résultats au bout de 4 minutes !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] _StringBetween2String()

#6

Message par Tlem »

Hoooo !!!
Exact. Quelle grossière erreur de ma part.

Il faut dire qu'au départ, j'avais testé les fonctions indépendamment et que je n'avais pas vu grand écart de temps.
Donc effectivement, si on adapte le code en rajoutant la ré-initialisation de $TMax avant la seconde boucle, alors l'écart de résultat diminue.
Mais au final, pour une boucle de 500 recherches, le temps est pratiquement identique (0.11 pour _StringBetween() et 0.12 pour StringBetween2String()).

Ceci dit, après avoir consulté la fonction dans l'include string.au3, j'avais bien vu que la fonction est à base de RegExp et donc forcément plus complète et rapide qu'une fonction basée sur les fonctions Stringxxxx().
Je n'était pas parti sur l'optique du nombre de résultats car je n'avais pas envie de développer la supériorité de RegExp. Mais comme vous l'avez fait magistralement, je pense que ça suffira. :D
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre