Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: left$/right$/mid$ *VB5*

Sivun loppuun

juhaz [25.08.2004 05:52:31]

#

Tämä on hieman noloa, koska minun pitäisi jo tietää tämä, mutta kuinka teen sillaisen, että ohjelma katsoo tiedostosta tekstiä ja jos esimerkiksi se sisältää tälläisen rivin:

<p>moi</p>

niin se näyttäisi tuon välissä olevan tekstin, joka nyt on 'moi'?

BadSource [25.08.2004 06:54:40]

#

Seuraavan lainen functio tuli ensimmäisenä mieleen erottamaan tekstistä tagit...

Public Function PoistaTagit(Teksti As String) As String
    Dim Alku As Integer, Loppu As Integer
    Dim osa As String

    Do
        Alku = InStr(1, Teksti, "<")
        Loppu = InStr(1, Teksti, ">")
        If Alku > 0 And Loppu > 0 Then
            osa = Mid(Teksti, Alku, (Loppu - Alku + 1))
            'Korvataan tagi välilyönnillä.
            'Tämä sen takia, että jos Teksti sisältää
            'useita tagien välisiä osia, niin ne palautetaan
            'välilyönnillä (tai useammalla) erotettuna.
            'Saa sitten muualla erotella osat toisistaan
            Teksti = Replace(Teksti, osa, " ")
        End If
    Loop Until Alku = 0 Or Loppu = 0
    PoistaTagit = Trim(Teksti)

End Function

Koska VB vitonen ei sisällä suoraan Replace-functiota, niin se pitää tehdä itse.

www.MicroSoft.com kirjoitti:

Public Function Replace(sIn As String, sFind As String, _
  sReplace As String, Optional nStart As Long = 1, _
  Optional nCount As Long = -1, Optional bCompare As _
  VbCompareMethod = vbBinaryCompare) As String
    Dim nC As Long, nPos As Integer, sOut As String

    sOut = sIn
    nPos = InStr(nStart, sOut, sFind, bCompare)
    If nPos = 0 Then GoTo EndFn
    Do
        nC = nC + 1
        sOut = Left(sOut, nPos - 1) & sReplace & _
        Mid(sOut, nPos + Len(sFind))
        If nCount <> -1 And nC >= nCount Then Exit Do
        nPos = InStr(nStart, sOut, sFind, bCompare)
    Loop While nPos > 0

EndFn:
    Replace = sOut
End Function

Edit: Typo-hunting season...

Edit Mark II: Katso Visual Basic -oppaista ja sieltä Osa 8 - Tiedostofunktiot miten tekstin saa esiin tiedostosta...

hunajavohveli [25.08.2004 15:24:34]

#

Luet merkkijonoa merkki kerrallaan merkkijonofunktiolla. Jos löytyy "<p>" alat lukea siitä kohdasta, kunnes löytyy "</p> ja tuolla välillä luetut merkit tallennat toiseen merkkijonoon.

kaviaari [25.08.2004 15:27:38]

#

Hieman offtopic mutta suomessa ei ole sanaa functio. Voit sanoa joko funkkari tai funktio. Functio kuulostaa harvinaisen aneemiselle.

juhaz [25.08.2004 20:29:10]

#

En ehkä ihan käsittänyt ideaa, mutta en saa toimimaan lopetustagia eli siis </p> vaan se toimii ainoastaan jos on <p>moi<p>.

Onko mitään muuta keinoa kuin tuo BadSourcen kertoma, koska tuon liittäminen minun selaimeeni voi olla vähän vaikeampi prosessi ja sitäpaitsi en saa tuota toimimaan ihan täysin, kuten haluaisin...

hunajavohveli [25.08.2004 20:56:22]

#

Private Sub Form_Load()

Static Text As String

Text = TagText("<p>Tämä osa merkkijonosta otetaan talteen!</p>")
a = MsgBox(Text)

End Sub

Function TagText(Text As String) As String

Static Tag As String
Static Tage As String
Tag = "<p>": Tage = "</p>"   'aloitus- ja lopetustagien määritelmät

For i = 1 To Len(Text)
  If Mid(Text, i, Len(Tag)) = Tag Then GTi = i + Len(Tag)
  If Mid(Text, i, Len(Tage)) = Tage Then
    TagText = Mid(Text, GTi, i - GTi)
    Exit For
  End If
Next i

End Function

Tekaisin tuommoisen koodinpätkän. Pitäisi toimia. Funktion koodista voit itse muokata alku- ja lopputageja. Annat funktiolle parametriksi merkkijonon, niin se palauttaa tagien välissä olevan tekstin.

BadSource [26.08.2004 07:22:07]

#

Hlvt... Väärä aamu tälläiselle...

[OffTopic]Kaviaari: Sori, otan suomen sanakirjani mukaan seuraavalla kerralla ja käynnistän selaimeni oikeinkirjoitustarkistuksen... Kun tarpeeksi monta kertaa kirjoittaa Public Function SeJaSe() As Jotain, niin onko ihme että kirjoitusasu tulee selkärangasta jostain Suomen- ja Englanninkielen välimaastosta, jos ei varta vasten mieti täyttääkö tämä kielipoliisin vaatimukset?

Muuten oman funktion tekeminen sille, että poistetaan tekstistä pelkästään kappaleen aloitus- ja lopetus-tagit jättäen kaikki muut tagit koskematta tuntuu varsin turhalta. Kovakoodaus tälläistä varten on turhan suuri ase hyttysjahtiin.[/OffTopic]

Prkleen funkkari... Voi Luoja!

hunajavohveli [26.08.2004 19:36:56]

#

No tuo minun funktioni ei ainakaan vain poista tageja, vaan etsii määritellyt tagit, ja palauttaa niiden välissä olevan tekstin. Toki sitä voi soveltaa vaikka niin, että tagit voi antaa parametreiksi.

BadSource [27.08.2004 07:21:04]

#

hunajavohveli kirjoitti:

No tuo minun funktioni ei ainakaan vain poista tageja, vaan etsii määritellyt tagit, ja palauttaa niiden välissä olevan tekstin. Toki sitä voi soveltaa vaikka niin, että tagit voi antaa parametreiksi.

Olet oikeassa. Myös omaa funktiotani pitäisi muuttaa sen verran, että funktio saa syötteensä ByVal, että alkuperäinen tekstirivi jäisi alkuperäiseen muotoonsa.

Tämä nyt on huonoa HoTMaiL-koodia, mutta täysin mahdollista, kun kerran HoTMaiL-koodia pystyy kirjoittaamaan miten sattuu.

<p>Oikein lyhyt kappale</p><p>Toinen lyhyt kappale</p>

Millä saat esiin tuon toisen kappaleen, jos funktionsi suoritus lopetetaan, kun saavutetaan ensimmäisen kappaleen lopetus?

Edit: Tuli mieleen entä jos kappale on muotoiltu?

<P ALIGN=LEFT|CENTER|RIGHT|JUSTIFY>Muotoiltu kappale?</P>

Heikki [27.08.2004 07:37:32]

#

BadSource kirjoitti:

Edit: Tuli mieleen entä jos kappale on muotoiltu?

Ei se oman selaimen tekeminen kovin helppoa ole :D

Tuossa pitää varmaan ensin etsiä <p tai <P, sitten etsiä tagin lopetusmerkki ja tallentaa parametrit (joita pitää sitten vielä käsitellä...). Sitten etsitään </p> tai </P>, ja tallennetaan itse merkkijono jne...

Kyllä siinä koodattavaa riittää.

Blaze [27.08.2004 11:05:36]

#

Tein toissapäivänä PHP:llä X(HT)ML:ää värittävän skriptin. Jos jaksatte purkkakoodia kahlata, niin tuo löytyy osoitteesta http://pp.kpnet.fi/blaze/temp/xmlcolor.php?sivu­=https://www.ohjelmointiputka.net
Toteutus on kaukana optimaalisesta, mutta ehkä siitä saa ideoita, miten tuon homman voi tehdä.

hunajavohveli [27.08.2004 15:16:27]

#

BadSource kirjoitti:

Millä saat esiin tuon toisen kappaleen, jos funktionsi suoritus lopetetaan, kun saavutetaan ensimmäisen kappaleen lopetus?

No eihän tuo nyt ole homma eikä mikään. Sen kuin vain poistaa Exit For -lopetuksen ja vaihtaa muuttujaan sijoituksen muuttujaan lisäykseksi. Tähän tapaan:

Private Sub Form_Load()

Static Text As String

Text = TagText("<p>Tämä osa merkkijonosta otetaan talteen!</p> tämä osa ei tule <p> Myös tämä osa tulee</p>")
a = MsgBox(Text)

End Sub

Function TagText(Text As String) As String

Static Tag As String
Static Tage As String
Tag = "<p>": Tage = "</p>"   'aloitus- ja lopetustagien määritelmät

For i = 1 To Len(Text)
  If Mid(Text, i, Len(Tag)) = Tag Then GTi = i + Len(Tag)
  If Mid(Text, i, Len(Tage)) = Tage Then
    TagText = TagText + Mid(Text, GTi, i - GTi)
  End If
Next i

End Function

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta