RegEx?

  • Hi zusammen, ich hoffe jemand kann mir sagen wie das ganze funktioniert. Von einem Source Code brauche ich mehrere Informationen.

    <td><a href="index.php?id=6543&screen=view">Test (12-34)</a></td>
    <td>12154</td>
    <td>asdf</td>

    Dieser Code steht auf drei verschiedenen Zeilen. Ich würde gerne die ID (6543) der angezeigt Namen (Test (12-34)) und der Preis 12154 zurückbekommen. Wie kann ich dies mit AutoIt und Regex lösen?
    Teilweise ist dieser Code bis zu 1000 mal auf der Webseite vorhanden.

    Bisher habe ich es mit einer eigenen SearchAndCut Funktion gelöst (Weiter unten), jedoch dauert das auslesen so bis zu einer Minute..

    Gruss

    Die SearchAndCut Funktion kann so mit mehreren Parametern aufgerufen werden..

  • Probiere es mal damit:

    Annahme: Name und Preis sind synchron.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Da wir die kompletten Daten nicht kennen (um welche Seite handelt es sich denn?) kann man das Pattern lediglich auf das Beispiel hin basteln:

    AutoIt
    #include <Array.au3>
    $s_String = '<td><a href="index.php?id=6543&screen=view">Test (12-34)</a></td>' & @CRLF & '<td>12154</td>' & "<td>asdf</td>"
    
    
    For $Match in StringRegExp($s_String, '(?s)<td><a\shref="index\.php\?id=(\d+).*?>([^<]+)<.+?<td>(\d+)', 4)
    	_ArrayDisplay($Match)
    Next
  • Bringe beide eure Lösungen nicht zum laufen..?

    Hier mal ein Auszug, leider ist es ein geschützter Bereich welcher nur für Mitglieder sichtbar ist..


    Schon mal grosses Dankeschön im vorraus!

    Greetz

    Edit:
    Sorry, AspirinJunkie, deine Lösung ist perfekt!
    Vielen Dank dafür :)

  • Dieser Code


    produziert folgendes Ergebnis:

    Code
    Art1(12-31)	5277	499 €
    Art2 (40-483)	5278	899 €
    Art3 (399-486)	5280	19999 €

    Dieses Resultat willst du doch oder?

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Siehe mein anderen Post :)
    Ein andere Frage hätte ich jedoch noch.. Ich habe die Lösung von AspirinJunkie verwendet, verstehe den RegEx jedoch nur halb..

    Wenn der Quellcode so aussieht:


    Und ich noch die Anzahl Artikel auslesen will (1/23, 99/1000 & 5/26), also beide Zahlen, wie müsste der RegEx aussehen? Habe es so probiert, funktioniert jedoch nicht..

    AutoIt
    For $Tmp in StringRegExp($source, '(?s)<td><a\shref="index\.php\?id=(\d+).*?>([^<]+)<.+?<td>(\d+)<\/td><td>.*<\/td><td>.*<\/td><td>(.*)<\/td>', 4)
    		_ArrayDisplay($Tmp)
    	Next

    Danke für die Hilfe!

    Gruss

    • Offizieller Beitrag

    Hallo,

    so sollte es gehen!

    AutoIt
    StringRegExp($source, '(?s)<td><a\shref="index\.php\?id=(\d+).*?>([^<]+)<.+?<td>(\d+)<\/td>.*?<td>(\d+\/\d+)<\/td>', 4)
  • Wenn die Anzahl der Spalten fest ist, musst du eigentlich nur noch die beiden Spalten dazwischen auslassen.
    Du hast jedoch .* verwendet. In dem Moment wird er solange im String weitersuchen bis er das letzte <td gefunden hat, denn .* ist gierig - es will soviel wie möglich sammeln.
    Deswegen hilft .*?. Dann sucht er nur bis zum ersten <td.

    Das erweiterte Pattern könnte daher so aussehen:

    Code
    (?s)<td><a href=".+?\?id=(\d+).*?>([^<]+)<.+?<td>(\d+).+?<td.+?<td.+?<td>([^<])+


    Aber: Das wird mit dem Verständnis dann immer komplizierter.
    Und spätestens in einem Jahr, wenn du das wieder anpassen willst, weißt du nicht mehr was hier eigentlich passiert.
    Daher wäre eine intuitivere Methode sicherlich die bessere Wahl als ein solches RegEx-Ungetüm.

    Hier daher mal ein Beispiel wie man an die Daten gelangt in dem man den XML-String schrittweise über CSS-Selektoren zerlegt:

    Spoiler anzeigen
  • Vielen Dank erneut AspirinJunkie :)
    Beim RegEx war lediglich das letzte '+' um eine Stellle verschoben.
    Ich hoffe ich finde mich zurecht, werde nun das ganze ein bisschen öfter probieren.

    Gruss
    Fr34k

  • Und hier kommt nochmals eine Frage - Weiss nicht wieso ich nicht gleich von Anfang an den Kompletten Code verwendet habe.. -.^
    Es werden mehrere Zeilen, ich komme jedoch mit dem hidden nicht klar..


    Ich brauche folgende Infos:
    Artikelname: Art1(12-31)
    Bestand: 1/23
    8364
    0
    723
    45
    0
    3
    1256
    0

    Wie komme ich an all diese Infos? Die Anzahl der Spalten bleibt immerhin immer die gleiche :)
    Gruss
    Fr34k

  • Siehe mein vorheriges Beispiel ohne RegEx:

    Spoiler anzeigen

    3 Mal editiert, zuletzt von AspirinJunkie (10. Juni 2015 um 13:24)

  • Und nochmals eine Frage -.-'
    Teils Links sehen so aus:

    Code
    class="result-item detail-page-link result-item--visited" href="/kaufen/105038365"


    andere so:

    Code
    class="result-item detail-page-link" href="/kaufen/104485987"

    Ich möchte in beiden Fällen die Nummer hinter dem /kaufen/ haben.
    Bin bisher so weit:

    AutoIt
    $Match = StringRegExp($source, '(?s)class=\"result-item detail-page-lin.+?\" href="\/kaufen\/(.+?)\"')

    Gemäss verschiedenen Online-Regex Tester sollte dies auch funktionieren, macht es aber nicht. Wieso?

    Gruss

  • Möchtest du die Nummer nun als String haben oder willst du nur testen ob es matcht?
    Momentan enthält $Match nur entweder True oder False - je nachdem ob es matcht.

    Den Inhalt von $source kennen wir nicht - für die beiden Schnipsel funktioniert es aber:

    AutoIt
    #include <Array.au3>
    
    
    $source = 'class="result-item detail-page-link result-item--visited" href="/kaufen/105038365"' & @CRLF & _
    'class="result-item detail-page-link" href="/kaufen/104485987"'
    
    
    $a_Match = StringRegExp($source, 'class="result-item detail-page-link[^"]*?"[^>]+?href="/kaufen/(.+?)"', 3)
    _ArrayDisplay($a_Match)