Hallo zusammen,
ich plage mich heute schon den ganzen Tag damit, aus einer einfachen Webseite, die nur 4 Zeilen Text enthält, die entsprechenden Readings herauszukriegen.
Der Code sieht folgendermaßen aus:
<html>
<head>
<link rel="stylesheet" href="resource://content-accessible/plaintext.css">
</head>
<body>
<pre>
vol: 118
num: 0
stn: Rockantenne-Rock'n'Roll
tit: Chubby Checker - Limbo rock
sts: 1
</pre>
</body>
</html>
Es sollen die Werte hinter "stn" und "tit" als Readings erfasst werden.
Ich habe schon versucht, es mit HTTPMOD hinzubekommen, scheitere aber vermutlich an den richtigen Regex.
Oder irgendwas, was alles andere "wegschneidet" und nur die Werte als "Sender" und "Titel" in Readings schreibt
Das Versuchs-Listing dazu:
Internals:
BUSY 0
CFGFN
DEF http://192.168.1.92/?infos 10
FUUID 5d7801c5-f33f-2ba6-7766-4f737e88d4d68f35
Interval 10
LASTSEND 1568149544.27841
MainURL http://192.168.1.92/?infos
ModuleVersion 3.5.9 - 13.2.2019
NAME h_KaRadio2
NOTIFYDEV global
NR 21251
NTFY_ORDER 50-h_KaRadio2
STATE ???
TRIGGERTIME 1568149554.27729
TRIGGERTIME_FMT 2019-09-10 23:05:54
TYPE HTTPMOD
addr http://192.168.1.92:80
auth 0
buf
code 200
compress 1
conn
data
displayurl http://192.168.1.92/?infos
header
host 192.168.1.92
httpbody vol: 160
num: 0
stn: Rockantenne-Rock'n'Roll
tit: McCoys - Hang on sloopy
sts: 1
httpheader HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 81
Connection: keep-alive
httpversion 1.0
hu_blocking 0
hu_filecount 2
hu_port 80
hu_portSfx
ignoreredirects 0
loglevel 4
path /?infos
protocol http
redirects 0
timeout 2
url http://192.168.1.92/?infos
value 0
QUEUE:
READINGS:
2019-09-10 23:05:44 stn 1
REQUEST:
data
header
ignoreredirects 0
retryCount 0
type update
url http://192.168.1.92/?infos
value 0
defptr:
readingBase:
stn reading
readingNum:
stn 01
readingOutdated:
requestReadings:
update:
stn reading 01
sslargs:
Attributes:
enableControlSet 1
reading01Name stn
reading01RegOpt s
reading01Regex (?s)stn:.*?(\d+)
showBody 1
userattr reading01Name reading01RegOpt reading01Regex
Ich habe mich schon quer durchs Forum gelesen, dass mir der Kopf raucht, aber etwas für meine einfachen Zwecke passendes habe ich noch nicht gefunden. Die Sache mit den Regex werde ich wohl nie verstehen...
Gruß
Dirk
Hallo Dirk,
ich bin jetzt auch kein RegEx-Experte...
Aber folgendes sollte doch tun:
reading01Name Station
reading01Regex stn:.(.*)
reading02Name Title
reading02Regex tit:.(.*)
Getestet mit: https://regex101.com/
Gruß, Joachim
https://regex101.com/ ist dein Freund
So wie deine Regex geschrieben ist: capturing group = (\d+)
Die sucht auf mehrere Zeilen die erste Zahlenfolge nach stn:
Ergebnis: die 1 nach sts:
Mit Joachims Regex:
Kein (?s) => wird nicht auf mehrere Zeilen matchen
stn:. => matcht "stn:" + das erste Leerzeichen
(.*) => capture was danach kommt, bis zu Ende der Zeile
EDIT: und lösche dein attr regOpt s sonst wirst Du wieder auf mehrere Zeilen matchen (genauso wie (?s))
Na bitte, kaum macht man es richtig, geht es. ;D
Vielen Dank ihr beiden, auch für die Erläuterungen. Meine Regex waren nur mehrfach zusammengeklautes und erfolglos ausprobiertes Zeug :-[ .
Grüße, Dirk