Da ja immer wieder gefragt wird, wie man etwas aus einem Quelltext rausließt, habe ich hier mal ein kleines Beispiel gemacht.
Zum einen nutze ich den HTTPWebRequest, welcher besser geeignet ist als das WebBrowser Control und statt bei einer bestimmten Zeichenkette zu Splitten nutze ich hier die deutlich professionelleren Regular Expressions. Leider wird ja bisher noch nicht auf allen Seiten der W3C Standard angewendet, denn würde dies der Fall sein, könnte man viel mehr Informationen einfach auslesen, wenn DIV Container IDs haben.
Bei meinem Beispiel nutze ich folgende PHP Datei:
Und hier der VB-Code:
Kleine Info zu den RegEx Pattern:
Mit (?<name>(pattern)) kann man einen Gruppennamen festlegen, wobei name durch etwas beliebiges, eindeutig identifizierbares ersetzt werden kann. Ich habe die Gruppe "string" genannt und später beim Match sieht man ja das ich via .Group("string") dann auf eben diese Gruppe wieder zugreife. Dies ist vorallem von vorteil, wenn man im RegEx Pattern mehrere Infos haben möchte, z.B.:
Von <div id="test" class="außen">inhalt</div> möchte ich nun den KlassenNamen und Inhalt bekommen, also würde mein PatternString folgendermaßen aussehen: "\<div id=\""test\"" class=\""(?<class>(.*))\""\>(?<string>(.*))\<\/div\>"
nun kann habe ich in .Group("class") den KlassenNamen und in .Group("string") den Inhalt im DIV Container.
Das (.*) in den Pattern bedeutet lediglich akzeptiere alle möglichen Zeichen, keine oder mehrere. Dazu guckt man am besten in die MSDN Referenz , dort stehen alles, was man zur Erzeugung der Pattern benötigt.
Bei der IP könnte der PatternString z.B. auch folgendermaßen aussehen, da eine IP nur aus Zahlen und Punkten besteht
"\<div id=\""myip\""\>(?<string>([0-9.]*))\<\/div\>", heißt also es dürfen die Zahlen 0-9 enthalten sein und Punkte.
Edit: Hier ist noch ein Beispielprojekt
Download (71kb)
Edit:
Hier noch eine super Seite, wo man sich Pattern OPTISCH zusammen stückeln kann txt2re.com/
Edit (03.05.2010):
Da ich nun immer häufiger gelesen habe, das einige etwas auslesen möchten, wo die Pattern öfters zutreffen, habe ich mal ein wenig experimentiert und nun kann ich mit einem kleinen einfachen Code in meinem Beispiel z.B. alle URLs der IMG-Tags von einem HTML Dokument auslesen.
Wie man sieht total simpel. Sollten in der URL noch andere Zeichen vorkommen so müssten sie im Pattern nachgetragen werden, man sollte hier jedoch nicht (.*) eingeben, da ansonsten alles zwischen dem ersten und letzten Anführungszeichen ausgegeben wird, also bei dem Text
würde in der Listbox
angezeigt werden.
Edit: Hier noch ein gutes Tutorial codeproject.com/KB/dotnet/regextutorial.aspx
Zum einen nutze ich den HTTPWebRequest, welcher besser geeignet ist als das WebBrowser Control und statt bei einer bestimmten Zeichenkette zu Splitten nutze ich hier die deutlich professionelleren Regular Expressions. Leider wird ja bisher noch nicht auf allen Seiten der W3C Standard angewendet, denn würde dies der Fall sein, könnte man viel mehr Informationen einfach auslesen, wenn DIV Container IDs haben.
Bei meinem Beispiel nutze ich folgende PHP Datei:
Und hier der VB-Code:
VB.NET-Quellcode
- Imports System.Net
- Imports System.IO
- Imports System.Text.RegularExpressions
- Public Class Form1
- Dim peoples() As String
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://server.de/test.php")
- Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
- Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
- Dim httpContent As String = reader.ReadToEnd
- txtSourcecode.Text = httpContent
- Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")
- Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString()
- lblIP.Text = "Deine IP: " & myIP
- Dim peopleRegEx As New Regex("\<div id=\""sqlcollection\""\>(?<string>(.*))\<\/div\>")
- Dim sqlcollection As String = peopleRegEx.Match(httpContent).Groups("string").ToString()
- peoples = sqlcollection.Split(",")
- For Each sqlLine In peoples
- Dim sqlCells() As String = sqlLine.Split(";")
- lstPeoples.Items.Add(sqlCells(0))
- Next
- End Sub
- Private Sub lstPeoples_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPeoples.SelectedIndexChanged
- Dim sqlCells() As String = peoples(lstPeoples.SelectedIndex).Split(";")
- lblPeopleInfo.Text = "Wohnort: " & sqlCells(1) & vbNewLine & "Alter: " & sqlCells(2)
- End Sub
- End Class
Kleine Info zu den RegEx Pattern:
Mit (?<name>(pattern)) kann man einen Gruppennamen festlegen, wobei name durch etwas beliebiges, eindeutig identifizierbares ersetzt werden kann. Ich habe die Gruppe "string" genannt und später beim Match sieht man ja das ich via .Group("string") dann auf eben diese Gruppe wieder zugreife. Dies ist vorallem von vorteil, wenn man im RegEx Pattern mehrere Infos haben möchte, z.B.:
Von <div id="test" class="außen">inhalt</div> möchte ich nun den KlassenNamen und Inhalt bekommen, also würde mein PatternString folgendermaßen aussehen: "\<div id=\""test\"" class=\""(?<class>(.*))\""\>(?<string>(.*))\<\/div\>"
nun kann habe ich in .Group("class") den KlassenNamen und in .Group("string") den Inhalt im DIV Container.
Das (.*) in den Pattern bedeutet lediglich akzeptiere alle möglichen Zeichen, keine oder mehrere. Dazu guckt man am besten in die MSDN Referenz , dort stehen alles, was man zur Erzeugung der Pattern benötigt.
Bei der IP könnte der PatternString z.B. auch folgendermaßen aussehen, da eine IP nur aus Zahlen und Punkten besteht
"\<div id=\""myip\""\>(?<string>([0-9.]*))\<\/div\>", heißt also es dürfen die Zahlen 0-9 enthalten sein und Punkte.
Edit: Hier ist noch ein Beispielprojekt
Download (71kb)
Edit:
Hier noch eine super Seite, wo man sich Pattern OPTISCH zusammen stückeln kann txt2re.com/
Edit (03.05.2010):
Da ich nun immer häufiger gelesen habe, das einige etwas auslesen möchten, wo die Pattern öfters zutreffen, habe ich mal ein wenig experimentiert und nun kann ich mit einem kleinen einfachen Code in meinem Beispiel z.B. alle URLs der IMG-Tags von einem HTML Dokument auslesen.
VB.NET-Quellcode
- Imports System
- Imports System.Text.RegularExpressions
- Public Class Form1
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim rx As New Regex("<img(.*)src=""(?<url>([a-zA-Z0-9.:-_/]+))""(.*)>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
- Dim rxMatches As MatchCollection = rx.Matches(TextBox1.Text)
- For Each oMatch As Match In rxMatches
- ListBox1.Items.Add(oMatch.Groups("url").ToString())
- Next
- End Sub
- End Class
Wie man sieht total simpel. Sollten in der URL noch andere Zeichen vorkommen so müssten sie im Pattern nachgetragen werden, man sollte hier jedoch nicht (.*) eingeben, da ansonsten alles zwischen dem ersten und letzten Anführungszeichen ausgegeben wird, also bei dem Text
würde in der Listbox
angezeigt werden.
Edit: Hier noch ein gutes Tutorial codeproject.com/KB/dotnet/regextutorial.aspx
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Dodo“ ()