SetReceiveDataFilter RegEx Regel

Hallo,

die RegEx Regeln werden nicht mein Freund :mad:

Ich will in einem Modul eine SetReceiveDataFilter setzen.

Dies ist er String der über den Server Socket I/0 ankommt:


09.08.2019, 11:24:53 | RECEIVED [127.0.0.1:63593] | POST / HTTP/1.1<CR><LF>Host: 127.0.0.1:8081<CR><LF>User-Agent: NukiBridge_12345678<CR><LF>Accept: */*<CR><LF>Connection: Close<CR><LF>Content-Type: application/json;charset=utf-8<CR><LF>Content-Length: 82<CR><LF><CR><LF>{"nukiId": 987654321, "state": 1, "stateName": "locked", "batteryCritical": false}

Mich interessiert der Teil „nukiId“: 987654321


$this->SetReceiveDataFilter('.*987654321.*');

funktioniert es, ich will aber den „Präfix“, bzw. Feldbezeichnung „nukiID“: noch mit abfragen / abfangen.

Den RegEx Online Editor https://regex101.com habe ich schon bemüht, Debugger und Code war soweit okay, aber funktioniert irgendwie nicht.

Versucht habe ich:


$this->SetReceiveDataFilter('.*nukiId.:987654321.*');

Vermutlich völlig falsch! Kann jemand mich mal eben unterstützen?!?

Merci!

Uli


.*"nukiId": 987654321.*

Michael

Da fehlt wahrscheinlich noch das Leerzeichen zwische Doppelpunkt und Zahl im Filter.

Tommi

<Edit: Michael war schneller >

Ergänzend dazu wenn man so einen Fehler sucht:
Das was im Debug steht ist nicht das worauf IPS den Filter setzt!
Der Filter wirkt auf den JSON-String welcher im Datenfluss benutzt wird.
Um diese zu sehen, einfach im eigenen Modul ein SendDebug bei ReceiveData einbauen, ohne vorher einen Filter zu setzen.
Warum ist das wichtig?
Weil das JSON bestimmte Zeichen maskiert, vermutlich ist mein Beispiel oben auch falsch, da die doppelten Hochkomma im JSON maskiert sind ( vermutlich /" ).
Das ist dann aber auch falsch.


.*\"nukiId\": 987654321.*

Weil RegEx \ auch zum maskieren nutzt.
Das hier könnte funktionieren:


$this->SetReceiveDataFilter(preg_quote('.*\"nukiId\": 987654321.*'));

Michael

Hallo Michael,

danke für deine Tips. Auf die schnelle hat das nicht funktioniert.

Ich schaue später noch einmal in Ruhe.

Vielen Dank!

Uli

preg_quote('.*\"nukiId\": 987654321.*')

ergibt

\.\*\\"nukiId\\"\: 987654321\.\*

ich würde das so machen:


$this->SetReceiveDataFilter('.*\\\"nukiId\\\": 987654321.*');

oder so:


$this->SetReceiveDataFilter('.* nukiId[^:]*: 987654321.*');

Noch ein Hinweis:

der Wert 987654321 ist ja hier als Zahl ausgegeben worden. Mir ist passiert, das bei der Weiterverarbeitung und Weiterleitung dann der Wert als String interpretiert und dem zufolge ebenfalls in Hochkomma gesetzt wurde.

Damit fängt man m.E. alle Fällen ab


$this->SetReceiveDataFilter('.*nukiId\\\":[ \\\"]*987654321[\\\”]*.*');

  1. ob Wert mit oder ohne Hochkomma
  2. ob nach dem Doppelpunkt ein Leerzeichen kommt oder nicht

demel

Ah, sorry hast recht.
So sollte das sein:


$this->SetReceiveDataFilter('.*'.preg_quote('\"nukiId\": 987654321').'.*');

Michael

Danke an Alle, funktioniert jetzt !

Uli