Page 1 sur 1

[Func] _StringBetween2String()

Posté : mer. 20 juil. 2011 22:22
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))

Re: [Func] _StringBetween2String()

Posté : mer. 20 juil. 2011 23:55
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])

Re: [Func] _StringBetween2String()

Posté : jeu. 21 juil. 2011 00:28
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]

Re: [Func] _StringBetween2String()

Posté : jeu. 21 juil. 2011 08:39
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

Re: [Func] _StringBetween2String()

Posté : jeu. 21 juil. 2011 10:17
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 !

Re: [Func] _StringBetween2String()

Posté : jeu. 21 juil. 2011 11:38
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