efinf:blc2016:regex

Das Schweizer Sackmesser der String-Analyse und Verarbeitung.

Testen

str = "ananas and bananas"
if str =~ /a.a/
  puts "match't"
else
  puts "kein Match"
end

Extrahieren

scan liefert ein Array, das für jeden Match den enstprechenden String enthält (wenn keine Gruppen in der RegEx sind), oder für jeden Match ein Array mit allen Gruppenmatches.

str = "pineapple and bananas"
p str.scan(/a./)
p str.scan(/a(.)/)

Modifizieren

gsub ersetzt jeden Match mit dem angegeben String. Gruppenmatches können mit “\\1” etc. verwendet werden.

gsub ohne ! modifiziert den String nicht und liefert einen neuen String. gsub! (mit !) modifizert den String und liefert diesen als Resultat, ausser wenn kein Match vorliegt wird nil zurückgeliefert.

str = "pineapple and bananas"
p str.gsub(/a./, "vx")
p str.gsub(/a(.)/,"a->\\1<-")

Nach gsub kann zusätzlich ein Block folgen, der als Parameter den aktuellen match (als String) bekommt. Dieser wird durch das Resultat vom Block ersetzt. Beispiel:

str = "pineapple and bananas"
p str.gsub(/a./){|m|
  m[0]+m[1].upcase
}

Ziel: Englische Sätze von der Ich- in die Du-Form umschreiben mittels Regular Expressions. Beispiele:

  • I think my toe hurts → Why do you think that your toe hurts?
  • I'm so sad → Does is happen often that you're so sad?
  • I told you so → Can you elaborate on why you told me so?

Dateien vom Donnerstag 17.11. (bräuchten noch ein bisschen Arbeit):

  • Installieren Sie den Chrome (sudo apt-get install chromium-browser)
  • In Chrome, drücken Sie F12, um die Debug-Suite zu starten und aktivieren Sie den Tab “Network”
  • Gehen Sie auf die Startseite von Nesa: https://ksbg.nesa-sg.ch/loginto.php?mode=0&lang= (oder laden Sie die Seite neu)
  • Rechts-Klick auf ersten Netzwerkzugriff (mit Code 200): “copy as cURL” * Die curl-Kommandozeile in eine Datei speichern (z.B. startseite.curl)

Das curl-Kommando muss jetzt noch ein bisschen angepasst werden, damit die Cookies gespeichert und wiederverwendet werden:

  1. Fügen Sie die Optionen -L -b nesa-cookies.txt -c nesa-cookies.txt hinzu. Damit werden Umleitungen automatisch verfolgt und Cookies von der Datei nesa-cookies.txt gelesen und neue wieder dort gespeichert.
  2. Löschen Sie die entsprechende Header Option (falls vorhanden), die ein altes Cookie sendet (-H etc..)

Im login-Formular ist ein Hash, der beim login mitgesendet werden muss (damit werden wohl auch Timeouts festgestellt). Diesen gilt es zu extrahieren:

startseite = `bash startseite.curl`.force_encoding("ISO-8859-1").encode("UTF-8")
puts startseite
 
# loginhash=startseite.scan(/..../)[0][0]  # FIXME
puts "-> HASH <-"
puts loginhash
  • Loggen Sie sich auf Nesa ein.
  • Rechts-Klick auf ersten Netzwerkzugriff: “copy as cURL” * Die curl-Kommandozeile in eine Datei speichern (z.B. login.curl). *ACHTUNG* diese Datei enthält ihr Passwort im Klartext! Am besten ändern Sie ihr Passwort danach (oder auch davor).
  • Modifizieren Sie das curl-Kommando wie oben.
  • In diesem Kommando muss der loginhash angepasst werden
logincurl = File.read("login.curl")
puts logincurl
# logincurl.gsub!(.....)  # FIXME
puts logincurl  # ACHTUNG: Enthält ihr Passwort (eventuell durch regex rausfiltern).
 
# Erste Seite nach login herunterladen
nesaseite = `#{loginseite}`

Zusammengefasst als Funktion (liefert erste Seite nach Login):

def getStartPage
  `rm nesa-cookies.txt`
  startseite = `bash startseite.curl`.force_encoding("ISO-8859-1").encode("UTF-8")
 
  # input type="hidden" value="a68ae62b0e4ffd730c315e37f50d0d5d" name="loginhash"
 
  loginhash=startseite.scan(/value="([0-9a-f]+)"\s+name="loginhash"/)[0][0]
 
  curllogin=File.read("login.curl")
  curllogin.gsub!(/loginhash=([^']+)'/,"loginhash=#{loginhash}'")
  `#{curllogin}`.force_encoding("ISO-8859-1").encode("UTF-8")
end

Nach erfolgreichem Login muss die Seite nach den gewünschten Links abgesucht werden:

  • Im “F12-Modus”, klicken Sie oben link auf das Pfeilsymbol (inspect elements) und klicken Sie auf einen interessanten Link. Der entsprechende Code wird angezeigt.
  • Was zwischen nach href=“” zwischen den Anführungszeichen steht interessiert uns.

Zeichnen Sie dann einen beliebigen Seitenzugriff auf und kopieren sie das curl-Kommando, modifizieren Sie es wie oben und ersetzen die URL durch z.B. 'mypage'. Dieser String wird dann durch die gewünschte URL ersetzt.

  • efinf/blc2016/regex.txt
  • Last modified: 2016/11/29 14:24
  • by Ivo Blöchliger