String Between [Gelöst]

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    String Between [Gelöst]

    Hey leute,

    erstmal ich hab einen string alla:

    PHP-Quellcode

    1. <h3>Kizmo</h3><br /><span class="lastUpdate">Letzte Änderung am: 23.05.10 um 02:05:34 Uhr</span><br /><br />
    2. Kizmo wurde am 13.02.1991 in Wesel/NRW geboren. Schon von klein auf wurde er mit der Musik konfrontiert, ...</li><li onclick="window.location.href = '43-0-Urbanize.html';"><a href="http://german-inc.com/43-0-Urbanize.html']43-0-Urbanize.html[/url]"><img src="http://german-inc.com/index.php?rex_resize=100c__75h__urbanize_1.jpg']index.php?rex_resize=100c__75h__urbanize_1.jpg[/url]" alt="Urbanize" class="imageLeft" /></a>
    3. <h3>Urbanize</h3><br /><span class="lastUpdate">Letzte Änderung am: 21.05.10 um 07:05:44 Uhr</span><br /><br />
    4. Zusammengefunden haben sich die beiden Anfang 2005. Seitdem machen die beiden gemeinsame Sache...</li><li onclick="window.location.href = '41-0-Pietro-B.html';">


    jetzt möchte ich den String zwischen <h3> und </h3> rausfiltern.
    Dazu hab ich folgende funktion:

    VB.NET-Quellcode

    1. Public Function StringBetween(ByVal InputText As String, ByVal starttext As String, ByVal endtext As String)
    2. Dim lnTextStart As Long
    3. Dim lnTextEnd As Long
    4. Dim sReturn(50) As String
    5. Dim iReturn As Integer = 0
    6. Dim i As Integer
    7. While i <> -1
    8. lnTextStart = InStr(StartPosition, InputText, starttext, vbTextCompare) + Len(starttext)
    9. lnTextEnd = InStr(lnTextStart, InputText, endtext, vbTextCompare)
    10. If lnTextStart >= (StartPosition + Len(starttext)) And lnTextEnd > lnTextStart Then
    11. sReturn(iReturn) = Mid$(InputText, lnTextStart, lnTextEnd - lnTextStart)
    12. InputText = InputText.Remove(lnTextStart, lnTextEnd - lnTextStart)
    13. iReturn += 1
    14. Else
    15. Exit While
    16. End If
    17. End While
    18. Return sReturn
    19. End Function


    allerdings bekomm ich dann nur vom ersten <h3> </h3> ausschnitt den text, bei allen nachfolgenden kommt dann was anderes :(
    weiß jemand wie ich das problem lösen kann?

    mfg
    Icynator

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Icynator“ ()

    okay, ich wollts jetzt mal mit der regex probieren...
    jetzt sieht mein regex so aus:

    VB.NET-Quellcode

    1. Dim rx As New Regex("<h3(.*)>(?<Artists>([a-zA-Z0-9.:-_/]+))<(.*)/h3>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)


    allerdings funktioniert das so nich oO

    Von 26 Künstlern werden gradmal 15?! oder so erkannt -.-"
    Dafür brauchst du eine MatchCollection, wo alle Treffer enthalten sind.

    Die Einträge kannst du mit einer For Each-Schleife durchgehen.

    VB.NET-Quellcode

    1. Dim input As String = "Dein Input"
    2. Dim pattern As String = "<h3>([^<]+)</h3>"
    3. For Each m As Match In Regex.Matches(input, pattern)
    4. Console.WriteLine(m.Groups(1).Value)
    5. Next
    6. Console.ReadLine()


    Falls Du noch Fragen hast, kannst du diese gerne stellen.

    MfG

    LaPi schrieb:

    Dafür brauchst du eine MatchCollection, wo alle Treffer enthalten sind.

    Die Einträge kannst du mit einer For Each-Schleife durchgehen.

    VB.NET-Quellcode

    1. Dim input As String = "Dein Input"
    2. Dim pattern As String = "([^<]+)
    3. "
    4. For Each m As Match In Regex.Matches(input, pattern)
    5. Console.WriteLine(m.Groups(1).Value)
    6. Next
    7. Console.ReadLine()


    Falls Du noch Fragen hast, kannst du diese gerne stellen.

    MfG

    das is klar ;)
    im ganzen siehts so aus:

    VB.NET-Quellcode

    1. Dim rx As New Regex("<h3(.*)>(?<Artists>([a-zA-Z0-9.:-_\/]+))<(.*)/h3>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    2. Dim rxMatches As MatchCollection = rx.Matches(sSite)
    3. For Each oMatch As Match In rxMatches
    4. ListBox_Artists.Items.Add(oMatch.Groups("Artists").ToString())
    5. Next


    mit kangaroo´s vorschlag \/ ;)
    Funzt aber trozdem net :( erkennt nur 19 von 26 :( aber die namen stehn ALLE! in gleicher form da :(
    Um welche Seite handelt es sich ? Hier kannst Du Deine Regex-Pattern testen, auch indem Du eine URL als Quelle angibst. LaPi/PascalN's Pattern sind so wie ich sie auch gewählt hätte, wenn man sonst keine anderen Substrings aus dem Tag braucht.

    @LaPi,PascalN werde ich gerne überprüfen, bin nur gewohnt das Zeichen so zu escapen

    LaPi schrieb:

    Außerdem ist es unsinnig, bei <h3> was zu matchen (<h3(.*)>), da zwischen dem h3 und > nichts mehr kommt.

    Bei diesem Beispiel halt nicht.. Aber prinzipiell finde ich es zum Kotzen, wenn Programmierer nur für die eigenen Begebenheiten entwickeln, wenn man mit ganz wenig Aufwand das ganze viel allgemeiner machen kann.
    Schonmal an das gedacht?

    Quellcode

    1. <h3 class="test">...</h3>
    Hay,

    omg , alles so kompliziert gemacht^^

    Ganz einfach:

    Der Regex lautet :
    <h3>([^<]+)

    Code:

    VB.NET-Quellcode

    1. Dim M As MatchCollection = Regex.Matches(New Net.WebClient().DownloadString("Deinewebsite.de"), "<h3>([^<]+")
    2. For Each treffer As Match In M
    3. Messagebox.show(treffer.groups(1).value)
    4. Next


    Mfg Kevin.
    gewöhn dir am besten gleich mal Gruppennamen an, denn bei größeren Pattern checkt man irgendwann mehr nicht mehr durch, deshalb sah alles so "kompliziert" aus...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    und damit meinst du etwa?
    ich weiß aufjedenfall, dass Patternamen schöner sind, besser Lesbar und das ist sehr wichtig, sobald man z.B. in der Gruppe in einer Firma o.ä. programmiert...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---