Un pti problème (algorithme) que je n'arrive pas à résoudre

Résolu
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 19 nov. 2008 à 20:16
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 20 nov. 2008 à 15:40
Salut,

Alors voila, j'ai fait il y a plusieurs mois, une fonction qui permet de récupérer la balise html dans lequel se trouve le caret d'un textbox (le contenu du textbox est donc du html).
Elle fonctionne plutôt bien, mais j'ai un petit bug que je n'arrive décidément pas à corriger :

En fait, si j'ai ça :

<html>

</html>

et que le curseur est dans la balise
, la fonction va me récupérer

par contre, si j'ai ça :

<html>

</html>

là, ça marche plus, le problème est donc que si la balise est collé à une autre, ça fonctionne plus, et je trouve pas pourquoi.

Pouvez vous m'aider?

Voici mon code :

' Permet de récupérer le nom de la balise dans lequel on est (la dans où se trouve le caret)
    ' HTML = est égale au document HTML
    ' Position = est égale à la position du caret
    Shared Function Recuperer_Balise_Actuel(ByVal HTML As String, ByVal Position As Integer) As String
        ' Déclaration
        Dim RESULTAT As String = Nothing
        Dim DANS_UNE_BALISE_tmp1 As Boolean = True
        Dim DANS_UNE_BALISE_tmp2 As Boolean = True
        Dim DANS_UNE_BALISE As Boolean = False
        ' false = echec (n'est pas dans une balise)
        ' true = entre < et >

        Dim deb As Integer = Position
        Dim fin As Integer = Position
        Dim len As Integer = 0

        Dim uris As String
        Dim html2 As String = HTML
        HTML = HTML.ToLower
        Dim i As Integer = 0

        uris = Nothing

        ' Récupère la balise actuel (entre < et >)
        Try
            i = 0
            Do
                If HTML.Chars(Position - i) = ">" Then
                    DANS_UNE_BALISE_tmp1 = False
                    Exit Do
                ElseIf HTML.Chars(Position - i + 1) = "<" Then
                    deb = Position - i
                    Exit Do
                End If
                i += 1
            Loop

            i = 0
            Do
                If HTML.Chars(Position + i) = "<" Then
                    DANS_UNE_BALISE_tmp2 = False
                    Exit Do
                ElseIf HTML.Chars(Position + i - 1) = ">" Then
                    fin = Position + i
                    Exit Do
                End If
                i += 1
            Loop

            If DANS_UNE_BALISE_tmp1 And DANS_UNE_BALISE_tmp2 Then
                len = fin - deb
                uris = html2.Substring(deb + ("<").Length, len - ("<").Length)
                uris = uris.Replace(Environment.NewLine, "")
                DANS_UNE_BALISE = True
            Else
                DANS_UNE_BALISE = False
            End If

        Catch
            ' en fait, s'il y a une erreur, c'est parce que la position du caret se trouve après la fermeture de la toute dernière balise du document ou avant l'ouverture de la toute première balise du document HTML, et donc dans ce cas, le caret n'est pas dans une balise
            DANS_UNE_BALISE = False
        End Try

        If DANS_UNE_BALISE Then
            RESULTAT = uris
        Else
        End If

        Return RESULTAT
    End Function

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***

4 réponses

Supra3000 Messages postés 159 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 8 janvier 2010 2
19 nov. 2008 à 22:27
3
lillith212 Messages postés 1229 Date d'inscription vendredi 16 novembre 2007 Statut Membre Dernière intervention 16 juin 2009
20 nov. 2008 à 12:38
Bonjour,

<html>

</html>
ça fonctionne, grâce à InStr, par contre, si j'ai la même chose mais dans le sens inverse :
<html>

</html>
ou
<html>

</html>
C'est la même chose que tu as écrit???
Ou peut être que j'ai loupé un truc.
En tout cas  :
Description

Renvoie la position d'une occurrence d'une chaîne dans une autre, à partir de la fin de la chaîne.

Syntaxe

InstrRev(string1,string2[,start[,compare]])

La syntaxe de la fonction InstrRev comprend les éléments suivants :

Élément, Description, ----
string1, <object id="alink_4" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>Expression de chaîne dans laquelle la recherche est effectuée., ----
string2, Expression recherchée., ----
start, Facultatif.
<object id="alink_5" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>Expression numérique définissant la position de départ de chaque recherche. Si elle est omise, -1 est employé, ce qui signifie que la recherche commence à la dernière position de caractère. Si l'argument start contient la valeur
<object id="alink_6" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>Null, une erreur se produit., ----
compare, Facultatif. Valeur numérique indiquant le type de comparaison à utiliser lors de l'évaluation des sous-chaînes. Si elle est omise, une comparaison binaire est effectuée. Reportez-vous à la section Valeurs.

Valeurs

L'argument compare prend les valeurs suivantes :

Constante, Valeur, Description, ----
vbUseCompareOption, –1, Effectue une comparaison à l'aide de l'instruction Option Compare., ----
vbBinaryCompare,  0, Effectue une comparaison binaire., ----
vbTextCompare,  1, Effectue une comparaison de texte., ----
vbDatabaseCompare,  2, Microsoft Access seulement. Effectue une comparaison basée sur des informations contenues dans votre base de données.

extrait du msdn...
Le msdn rajoute : Notez que la syntaxe de la fonction InstrRev est différente de celle de la fonction Instr

Si ca peut t'aider...
Bon courage
S.L.B.
<hr />
3
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
20 nov. 2008 à 06:57
Salut,

Merci, ça fonctionne à présent. Enfin presque :
Maintenant, quand j'ai ça :
<html>

</html>
ça fonctionne, grâce à InStr, par contre, si j'ai la même chose mais dans le sens inverse :
<html>

</html>
ou
<html>

</html>
Et bien on a de nouveau un bug. Normal devrais-je dire, puisque la fonction InStr effectue la recherche quand dans un sens uniquement. J'ai tenté d'utiliser InStrRev, mais ça doit pas être ça

Existe-il une commande pour la faire la même chose mais dans le sens inverse?

Merci

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
20 nov. 2008 à 15:40
Salut,

C'est bon, tout fonctionne parfaitement à présent, je m'étais trompé dans les arguments à mettre dans InStrRev.
Merci beaucoup, je ne connaissait pas cette commande, je vais pouvoir l'utiliser ailleur, à des endroits qui utilisent le même système que j'avais fait ici.

PS = oui, tu a loupé un truc, regarde :
si la balise div était séparé par un espace ou autre que < ou >, ça marchait :
<html>

</html>
si la fin de la balise était collé à une autre, ça marchait pas :
<html>

</html>
si le début de la balise était collé à une autre, ça marchait pas non plus :
<html>

</html>
et si tout était collé, ba c'était encore pire :
<html>

</html>

Mais maintenant, quoi qu'il arrive, ça fonctionne, encore merci =D

@++

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
0
Rejoignez-nous