[vb6] String bewerkingen

Pagina: 1
Acties:

  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:58
Hallo, ik ben momenteel bezig met het programmeren van een simpele webbrowser, echter deze keer wil ik geen gebruik maken van een kant en klaar ocx-je
het is de bedoeling dat de HTML uit elkaar "pluk" in een array met alle "losse" stukjes

een voorbeeld van wat ik bedoel:
van de string:
"Dit is een <b> klein </b> voorbeeldje"
naar de array:
(0) = "Dit is een "
(1) = "<b>"
(2) = " klein "
(3) = "</b>"
(4) = " voorbeeldje"

hiervoor heb ik de volgende module bedacht

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Option Explicit

Private myHTML As String
Private currentPos As Long
Private keywords(65535) As String
Private curKey As Long

'in deze module zit een methode die keyword voor keywoord een tekst uit elkaar haalt
'dit is een ingewikkelde methode, voorbeeld: als we een string hebben met: "hallo<b>hoi!</b>doei"
'dan moet deze uit elkaar gehaald worden in hallo, <b>, hoi!, </b>, doei
'dit kan dus niet met de split methode
'dit kan stuk voor stuk opgevraagd worden, aangezien het niet intressant is
'meer dan 1 keywoord of info tegelijk uit te lezen

Public Sub setHTML(html As String)
myHTML = html
currentPos = 0
'we gaan de html uit elkaar "pulken" en in de array zetten

Dim difLength As Long

Dim cPos As Long
cPos = 0
curKey = 0
For cPos = 1 To Len(myHTML) + 1

If Mid(myHTML, cPos, 1) = "<" Then
    'we hebben een stuk te pakken
    'de tekst hiervoor stoppen we in de array, en verwijderen we van de array
    keywords(curKey) = Left(myHTML, cPos)
    curKey = curKey + 1
    difLength = Len(myHTML) - Len(Right(myHTML, Len(myHTML)))
    myHTML = Right(myHTML, Len(myHTML) - cPos)
    cPos = cPos - difLength
    
        Do
            cPos = cPos + 1
            If cPos > Len(myHTML) Then Exit Do
        Loop Until Mid(myHTML, cPos, 1) = ">"
            difLength = Len(myHTML) - Len(Right(myHTML, Len(myHTML)))
            keywords(curKey) = Left(myHTML, cPos)
            cPos = cPos - difLength
            curKey = curKey + 1
            myHTML = Right(myHTML, Len(myHTML) - cPos)
    
End If

Next cPos

End Sub

Public Function getNext() As String
getNext = keywords(currentPos)

If currentPos > curKey Then
    currentPos = currentPos + 1
        Else
    currentPos = 0
End If

End Function

Public Function getLength() As Long
getLength = curKey
End Function


Dit blijkt echter niet helemaal te werken :(
Het gaat denk ik niet werken met de standaard Split() functie aangezien hij op meerdere punten moet splitsen

heeft iemand een idee van hoe ik dit kan aanpakken? _/-\o_

MvG, ThunderNet

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


Verwijderd

Zoek eens naar 'stack based parser' op dit forum. Die ideeen zijn ook goed te gebruiken om HTML te parsen.

HTH :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

ThunderNet schreef op zondag 05 december 2004 @ 19:31:
Dit blijkt echter niet helemaal te werken :(
En nu? Moeten wij nu maar raden wat er mis gaat? :)
Het gaat denk ik niet werken met de standaard Split() functie aangezien hij op meerdere punten moet splitsen
Dan split je toch een keer, en splits je het resultaat daarvan nog eens. Lijkt me geen probleem.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Ik denk dat je met instr moet gaan werken, een voorbeeld is b.v.
code:
1
2
3
4
5
6
7
8
9
10
Private Function ReplaceHTML(text As String)
    Dim intCount As Integer, intTemp As Integer
    intCount = 1
    Do While InStr(intCount, text, "<")
        intCount = InStr(intCount, text, "<") + 1
        intTemp = InStr(intCount, text, ">")
        MsgBox Mid(text, intCount, intTemp - intCount)
        intCount = intTemp
    Loop
End Function

Verwijderd

Wat dacht je van een referentie leggen naar "Microsoft VBScript Regular Expressions" (vbscript.dll) en reguliere expressies gebruiken. Heb je met een parse-actie alle tags in een matchcollection zitten.

  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:58
dankje the huuf :D daar kom ik al een heel eind mee _/-\o_
ik heb m een klein stukje aangepast
Visual Basic:
1
2
3
4
5
6
7
8
9
10
Public Function ReplaceHTML(text As String)
    Dim intCount As Integer, intTemp As Integer
    intCount = 1
    Do While InStr(intCount, text, "<")
        intCount = InStr(intCount, text, "<")
        intTemp = InStr(intCount, text, ">")
        MsgBox Mid(text, intCount, intTemp - intCount + 1)
        intCount = intTemp
    Loop
End Function

nu laat hij de tags er omheen zitten....
B) ik heb ook al wat andere dingetjes geprobeerd maar ik krijg t nog niet echt voorelkaar om de tekst buiten de tags ook te laten zien....
als ik in de parameter nu "Dit is een <b> klein </b> voorbeeldje" meegeef
krijg ik een textbox met "<b>" en een textbox "</b>" echter het is de bedoeling om "Dit is een " & " klein " & " voorbeeldje" ook uit te kunnen lezen. :)

@Thargol
Ik denk niet dat een juiste oplossing is in dit scenario... aangezien dit om html gaat (eerst alleen om html 4.01, maar later ook voor xhtml etc.)

[ Voor 17% gewijzigd door ThunderNet op 05-12-2004 20:27 ]

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • Poltergeist
  • Registratie: Oktober 2000
  • Laatst online: 23:07
<!--Geen ervaring met VB, wel met PowerBasic--> Maar je zou zoiets kunnen doen:
code:
1
2
3
4
5
6
7
8
Intcount=1
Do While instr(intcount,text,any "<>")
     startcount=intcount
     intcount=instr(intcount, text,any "<>")
     msgbox mid(text,startcount,intcount)
     incr intcount
    
Loop


Ik weet alleen niet of VB "any" ondersteund

[ Voor 13% gewijzigd door Poltergeist op 05-12-2004 20:33 ]


Verwijderd

Heb een voorbeeld gemaakt

Modbreak:Leuk. En nu? Nu wordt je code gekopieerd en HOOP je maar dat iemand er wat van leert.

Leg de volgende keer gewoon uit hoe je het op zou kunnen lossen en post een stukje voorbeeld code hier zodat iedereen die de draad leest er wat aan heeft.

[ Voor 174% gewijzigd door Creepy op 06-12-2004 09:32 ]


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:58
bedankt _/-\o_ hier kan ik wel mee verder komen denk ik....

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:58
Naar goed gekeken te hebben naar de code van huuf, heb nu een werkende functie
helaas zit ik met de grootte van de array keywords(25)
ik heb m nu vast gedeclareerd als 25, en hou zelf met een integer bij, hoeveel data ik er in heb gezet.
Ik krijg het niet voorelkaar, om hem dynamisch uit te breiden.

hieronder mijn code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Public Function ReplaceHTML2(ByVal text As String) As String
    Dim intCount As Integer, intTemp As Integer
    Dim IntCount2 As Integer, strTemp As String, strResult As String
    Dim keywords(25) As String
    Dim cnt As Integer
    
    strTemp = text
    cnt = 0
    
a1:
    For intCount = 1 To Len(strTemp)
        If InStr(intCount, strTemp, "<") = intCount Then
            'Nu zitten we op een punt dat er een "<" gevonden is
            keywords(cnt) = Left(strTemp, intCount - 1)
            cnt = cnt + 1
            strTemp = Right(strTemp, Len(strTemp) - intCount)
            GoTo a1: 'Stoute ik, ik weet het :$
        End If
        
        If InStr(intCount, strTemp, ">") = intCount Then
            'Nu zitten we op een punt dat er een "<" gevonden is
            keywords(cnt) = "<" & Left(strTemp, intCount) ' "<" & is een kleine hack, kon het niet anders oplossen :S
            cnt = cnt + 1
            strTemp = Right(strTemp, Len(strTemp) - intCount)
            GoTo a1: 'ik been een veelpleger :S
        End If
        
    Next intCount
    
    'nu zitten we mogelijk nog met een rest aan de rechterkant
    If Len(strTemp) > 0 Then
    keywords(cnt) = strTemp
    cnt = cnt + 1
    End If
    
Dim i As Integer

For i = 0 To UBound(keywords)
    If keywords(i) <> "" Then
        strResult = strResult & keywords(i) & vbCrLf
    End If
Next i

ReplaceHTML2 = strResult
End Function


voor TheHuuf, deze kun je in je voorbeeldprogramma gebruiken ipv van ReplaceHTML
heeft iemand nog een idee hoe ik het "probleem" met die array kan oplossen? (deze manier is geheugentechnisch niet echt netjes) B)

deze functie zet eerst alles in een array, en als laatste leest hij die array uit en zet het in een string gescheiden met linebreaks.... (dat is als voorbeeld/test gebruikt zodat je kunt zien wat er gebeurd)

[ Voor 10% gewijzigd door ThunderNet op 06-12-2004 16:26 ]

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ThunderNet schreef op maandag 06 december 2004 @ 16:24:
Ik krijg het niet voorelkaar, om hem dynamisch uit te breiden.
Als je de reDim documentatie er eens bij pakt :?
Remarks

The ReDim statement is used to size or resize a dynamic array that has already been formally declared using a Private, Public, or Dim statement with empty parentheses (without dimension subscripts).
En dit is dus écht niet the way to go. Ik zou gaan voor een regular expression ofzo. Op de weg die je nu ingeslagen bent ga je nog veel bulten tegenkomen vrees ik :X

En probeer op z'n minst die goto's te voorkomen :X stoutert!! :>

[ Voor 6% gewijzigd door RobIII op 06-12-2004 16:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:58
ik heb het met redim geprobeerd
toen gebruikte het volgende:
Visual Basic:
1
2
redim keywords(ubound(keywords) + 1) as string
keywords(ubounds(keywords)) = "blablabla"


Alleen dan krijg ik steeds error 9 :'(

over die goto's ik weet ik ben stout })
maar weet niet zo goed hoe ik dat moet gaan oplossen in deze functie

[ Voor 9% gewijzigd door ThunderNet op 06-12-2004 16:38 . Reden: blablabla even tussen aanhalingstekens gezet ]

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ThunderNet schreef op maandag 06 december 2004 @ 16:37:
ik heb het met redim geprobeerd
toen gebruikte het volgende:
Visual Basic:
1
2
redim keywords(ubound(keywords) + 1) as string
keywords(ubounds(keywords)) = "blablabla"


Alleen dan krijg ik steeds error 9 :'(
En waar krijg je die error 9? En wat zeg die error 9? En heb je de documentatie van ReDim er nou al bij gepakt? Want dan had je gezien dat redim je array leeg kiepert, tenzij je het (IMHO ook ranzige) preserve statement erbij gebruikt.

Hier in P&W is het de bedoeling dat je zélf programmeert en zoekt, niet dat we je handje vast houden.

Having said that, die error 9 krijg je omdat, als een array nog niet geïnitialiseerd is, de UBound er uit klapt.
Visual Basic:
1
2
Dim keyWords() As String
MsgBox UBound(keyWords)

Dit geeft je dezelfde error. Maar dat had je dus zelf ook kunnen ontdekken met een breakpoint, of logish je code nalopen (debuggen). Dit is basis programmeren....
Wil je dit probleem oplossen, dan hou je dus zelf een UBound bij, of gebruik je een "alternatieve" ubound die je zelf schrijft, en die -1 ofzo teruggeeft als een array nog niet geïnitialiseerd is. Maar dat is easy te googlen.

[ Voor 25% gewijzigd door RobIII op 06-12-2004 16:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:58
ben inmiddels druk opzoek met Deel 1 van de reference library op schoot. B)

inmiddels het het dynamische array "probleem" opgelost |:( stomme ik |:(
ik zit nu te bedenken hoe ik het mooiste die goto's kan weghalen ook opgelost inmiddels
ik heb de for lust vervangen door een do while lus aangezien hij dan geen statisch "eindpunt" heeft wat wel het geval is bij een for lus.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Public Function ReplaceHTML2(ByVal text As String) As String
    Dim intCount As Integer, intTemp As Integer
    Dim IntCount2 As Integer, strTemp As String, strResult As String
    ReDim keywords(0) As String
    strTemp = text
    
intCount = 0
Do
    intCount = intCount + 1
        If InStr(intCount, strTemp, "<") = intCount Then
            'Nu zitten we op een punt dat er een "<" gevonden is
            ReDim Preserve keywords(UBound(keywords) + 1) As String
            keywords(UBound(keywords)) = Left(strTemp, intCount - 1)
            strTemp = Right(strTemp, Len(strTemp) - intCount)
            intCount = 1
        End If
        
        If InStr(intCount, strTemp, ">") = intCount Then
            'Nu zitten we op een punt dat er een ">" gevonden is
            ReDim Preserve keywords(UBound(keywords) + 1) As String
            keywords(UBound(keywords)) = "<" & Left(strTemp, intCount) ' "<" & is een kleine hack, kon het niet anders oplossen :S
            strTemp = Right(strTemp, Len(strTemp) - intCount)
            intCount = 1
        End If
Loop Until intCount >= Len(strTemp)
    
    'nu zitten we mogelijk nog met een rest aan de rechterkant
    If Len(strTemp) > 0 Then
    ReDim Preserve keywords(UBound(keywords) + 1) As String
    keywords(UBound(keywords)) = strTemp
    End If
      
'het is inmiddels in de array opgeslagen, nu zetten we het voor test redenen gescheiden met enters in een string
Dim i As Integer
For i = 0 To UBound(keywords)
    If keywords(i) <> "" Then
        strResult = strResult & keywords(i) & vbCrLf
    End If
Next i

ReplaceHTML2 = strResult
End Function

[ Voor 138% gewijzigd door ThunderNet op 06-12-2004 17:29 ]

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?

Pagina: 1