Bestimmte Kombination auslesen

  • Hallo,

    ich suche einen Befehl, womit ich eine bestimmte Kombination auslesen kann.

    Code
    <crypter name="Linksave.in" status="3" size="-1" hoster="Fileserve.com">http://linksave.in/1611xxx404cd80b42682a1</crypter>

    der code ist eine Zeile aus einer Textdatei, was ich mit

    [autoit]

    FileReadLine($file)

    [/autoit]


    auslese

    ich würde jetzt prüfen lassen, was zwischen Fileserve.com"> und < steht
    und auslesen

    ist das der richtige Weg und welcher Befehl ist das? dann könnte ich nochmal genau nachlesen wie man es umsetzt

    Gruß

    3 Mal editiert, zuletzt von Slider99 (9. Dezember 2010 um 23:15)

    • Offizieller Beitrag
    [autoit]

    $String = ' <crypter name="Linksave.in" status="3" size="-1" hoster="Fileserve.com">http://linksave.in/1611xxx404cd80b42682a1</crypter>'
    $Result = StringRegExp($String, 'Fileserve.com">(.*)<', 3)
    MsgBox(0, "Gefunden", $Result[0])

    [/autoit]
  • Vielen Dank an AspirinJunkie und Raupi
    Ein besonderes Dankeschön an Raupi, wegen dem Code.
    Cool wäre es, wenn jeder Poster sein PayPal Spenden-Button in der Signatur
    hätte, so könnte man gleich `nen Euro als Dankeschön überweisen.
    Ich vermute aber, dass die Zahlungsmoral im Internet zu wünschen lässt
    und daher war es nur eine nette Idee, die schnell wieder verfliegt.

  • Hallo,
    ich habe Schwierigkeiten den String richtig auszuwerten
    wer kann mir bitte dabei helfen?

    hier lese ich ein und speicher ab, da es ersteinmal einfacher ist
    (http://www.imdb.de/title/tt0111161/plotsummary) Inhaltsangabe für Die Verurteilten

    Spoiler anzeigen
    [autoit]

    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("GET","http://www.imdb.de/title/tt0111161/plotsummary")
    $oHTTP.Send()
    $HTMLSource = $oHTTP.Responsetext
    $filecover = FileOpen("html.txt", 2)

    [/autoit] [autoit][/autoit] [autoit]

    ; Prüfen, ob Datei eingelesen wurde
    If $filecover = -1 Then
    MsgBox(0, "Fehler", "Die Datei html.txt konnte nicht geöffnet werden.")
    Exit
    EndIf
    FileWrite($filecover, $HTMLSource)

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($filecover)

    [/autoit]

    hier lese ich die html.txt und versuche einen String zu finden

    Spoiler anzeigen
    [autoit]

    $Beschreibungtxt = FileOpen("html.txt", 0)
    If $Beschreibungtxt = -1 Then
    MsgBox(0, "Error", "Konnte Datei html.txt nicht öffnen.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $beschreibung = FileRead($Beschreibungtxt)

    [/autoit] [autoit][/autoit] [autoit]

    $Result = StringRegExp($beschreibung, "<!DOCTYPE HTML PUBLIC ""-//W(.*)C//DTD HTML 4.01 Tran",3)
    if @Error = 1 Then
    MsgBox(0, "Fehler", "keine Übereinstimmung")
    FileClose($Beschreibungtxt)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "Gefunden", $Result[0])

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    FileClose($Beschreibungtxt)

    [/autoit]

    Das Ergebnis ist 3 ( Zeile gleich am Anfang) und das klappt

    Wenn ich jetzt aber ein wenig in die Mitte gehe und dort etwas auslesen will, dann funktioniert es nicht

    zum Beispiel

    [autoit]

    $Result = StringRegExp($beschreibung, "<div id=""swiki.2.1"">(.*)diesmal in Freiheit.</div>",3)

    [/autoit]
    Code
    ich möchte zum Beispiel zwischen <div id="swiki.2.1"> UND diesmal in Freiheit.</div> den Text finden

    Ich glaube es liegt daran, da im Quellstring irgendwie Zeilenumbrüche sind.
    Wie kann ich mit StringRegExp das Problem lösen?

    vielen Dank im voraus

  • In der Voreinstellung kann der "." einen Zeilenumbruch nicht erfassen. Diese Einstellung kann aber mittels "(?s)" geändert werden ;)

    Probier das mal:

    [autoit]

    $Result = StringRegExp($beschreibung, "(?s)<div id=""swiki.2.1"">(.*?)</div>", 3)

    [/autoit]

    PS:
    Das "?" hinter dem "*" bewirkt, dass nur das nötigste gefunden wird ;)

  • das kann nicht gehen, da "/" bei StringRegExp als sonderzeichen dient
    genauso ist es mit "." (punkt)

    mit "\" kann man solche deklarieren.

    was mir noch auffällt ist, das du wohl ein wenig viele "" (anführungszeichen) in deinem code hast
    ich geh mal davon aus das im quellcode diese enthalten sind
    um deinem script aber dann zu sagen, das der suchstring nicht endet sondern nur anführungszeichen in diesem enthalten sind würde ich ' verwenden.

    versuchs mal so:

    [autoit][/autoit][autoit][/autoit][autoit]

    $Result = StringRegExp($beschreibung, '<div id=""swiki\.2\.1"">(.*?)diesmal in Freiheit\.<\/div>', 3)
    ;falsch verdtanden von mir

    [/autoit]

    EDIT:

    uups sollte die frage wohl besser lesen^^
    naja also ich weiß ja nicht warum du die anführungszeichen doppelt hast aber wie schon erwähnt kannst du unbestimmt viele leerzeichen bzw zeilenumbrüche sowie tab's mit "\s*" realisieren

    das sollte zu dem gewünschten ergebnis führen:

    [autoit]

    $Result = StringRegExp($beschreibung, '<div id="swiki\.2\.1">\s*(.*?)\s*<\/div>', 3)

    [/autoit]

    5 Mal editiert, zuletzt von Inferior (9. Dezember 2010 um 22:11)

  • um die im quellcode sich befindenden zeichen wie "<br/><br/>" rauszuschneiden würde ich in etwa so vorgehen:

    [autoit]

    #include <Inet.au3>

    [/autoit][autoit][/autoit][autoit]

    $beschreibung = _INetGetSource("http://www.imdb.de/title/tt0111161/plotsummary")
    $Result = StringRegExp($beschreibung, '<div id="swiki\.2\.1">\s*(.*?)\s*<\/div>', 3)

    [/autoit][autoit][/autoit][autoit]

    If IsArray($Result) Then
    $endResult = StringReplace($Result[0], "<br/><br/>", " ")
    MsgBox(0, "", $endResult)
    Else
    MsgBox(0, "", "Keine Übereinstimmung")
    EndIf

    [/autoit]

    2 Mal editiert, zuletzt von Inferior (9. Dezember 2010 um 22:20)

  • In der Voreinstellung kann der "." einen Zeilenumbruch nicht erfassen. Diese Einstellung kann aber mittels "(?s)" geändert werden ;)
    [quote='Cyberdyne','index.php?page=Thread&postID=200121#post200121']$Result = StringRegExp($beschreibung, "(?s)<div id=""swiki.2.1"">(.*?)</div>", 3)

    Prima, das hat sehr gut funktioniert :P

  • Ich schreibe noch einmal einen Post, weil ich mit dem Zitieren von mehreren Absätzen durcheinander komme, so ist es leichter 8)


    naja also ich weiß ja nicht warum du die anführungszeichen doppelt hast aber wie schon erwähnt kannst du unbestimmt viele leerzeichen bzw zeilenumbrüche sowie tab's mit "\s*" realisieren

    Probier mal bitte folgendes aus

    MsgBox(0, "Gefunden","Das ist eine 1")

    ; jetzt kommt die eins in Anführungsstriche
    MsgBox(0, "Gefunden","Das ist eine ""1""")

    ;das wäre falsch
    MsgBox(0, "Gefunden","Das ist eine "1"")

    ;darum macht man bei Anführungsstrichen im Text, Anführungsstriche bei jedem " dazu


    ansonsten einen sehr großen Dank, für deine Hilfe :P

    Dein Code

    [autoit]

    $Result = StringRegExp($beschreibung, '<div id="swiki\.2\.1">\s*(.*?)\s*<\/div>', 3)

    [/autoit]


    funktioniert leider nicht richtig

    und für den Tipp wegen des

    Code
    <br/>

    auch vielen Dank
    da das

    Code
    <br/>

    für Zeilenumbruch steht, habe ich deshalb

    [autoit]

    $brweg = StringReplace ($ohnecats, "<br/>", "" & @CRLF)

    [/autoit]


    geschrieben

    Hier das vorläufe Script zum testen

    [autoit]

    $id = InputBox("ID Nummer", "Bitte die ID mit tt..... eingeben","tt0111161")
    $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("GET","http://www.imdb.de/title/" & $id & "/plotsummary")
    $oHTTP.Send()
    $HTMLSource = $oHTTP.Responsetext

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Result = (StringRegExp($HTMLSource, "(?s)<div id=""swiki.2.1"">(.*)<div class=""d",3))
    if @Error = 1 Then
    MsgBox(0, "Fehler", "keine Übereinstimmung")

    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $ohnecats = StringReplace (($Result[0]), "</div>", "") ; bestimmte Zeichen werden gelöscht
    $brweg = StringReplace ($ohnecats, "<br/>", "" & @CRLF) ; Zeilenumbruch
    $ohneleer = StringStripWS($brweg,4) ; doppelte leerzeichen werden gelöscht
    MsgBox(0, "Gefunden",$ohneleer)

    [/autoit]

    4 Mal editiert, zuletzt von Slider99 (9. Dezember 2010 um 23:06)

  • also das mit den "" wusste ich nicht wirklich, weil ich das immer mit ' am anfang und ende gelößt habe
    das funktioniert auch zum deklarieren und meiner meinung nach ist es übersichtlicher ;)

    also mein script funktioniert tadellos liegt aber wohl daran das ich es mit _INetGetSource gelöst habe, und da verhält sich das ganze alles ein wenig anders O.o

    mit $oHTTP.Open() und $oHTTP.Send() hab ich noch nicht gearbeitet, finde es aber interessant und werd mir das nochmal ansehen ;)

    schön das es funktioniert und das man helfen konnte

    gruß Inferior