...auf Kriegsfuß mit RegEx

Hallo Leute,

mein SetReceiverDataFilter sieht in einem Modul so aus:

$Filter = '(.*"DeviceID":'.$this->ReadPropertyString("DeviceID").'.*)';
$this->SetReceiveDataFilter($Filter);

lässt aber nicht durch was es soll…

Im ReceiveData filtere ich so:

If ($data->DeviceID == $this->ReadPropertyString("DeviceID")) {
	$this->ShowData($data->DeviceDataArray);
}

Das funktioniert…

Ich vermute daher das ich einen Syntax-Fehler im $Filter habe…

Sieht jemand den Fehler?

Joachim

Im Filter fehlen die " um dein DeviceID.

$Filter = '(.*"DeviceID":"'.$this->ReadPropertyString("DeviceID").'".*)';
$this->SetReceiveDataFilter($Filter);

Die Abfrage im ReceiveData kannst du anschließend entfernen.

Wenn ein Filter mal nicht will, dann Bau im Parent beim SendataToChildren eine Debug Ausgabe des JSON ein.
Oder, falls der Parent ein Symcon IO ist:
Einmal den Child ohne Filter und mit Debug des JSON im ReceiveData testen.
Dann hast du den ‚Roh‘ String vom Datenfluss auf welchen der Filter wirken muss.
Michael
PS: wohl eher auf Kriegsfuß mit dem JSON String :wink:

Hallo Michael,

das funktioniert leider nur teilweise…

Was mir bei der Suche aufgefallen ist: Einige der DeviceID enthalten ein „/“, bei denen wo das nicht der Fall funktioniert es…

Die DeviceID kann ich aber selbst so nicht ändern, kann ich das irgendwie umgehen?

Joachim

Ja klar.
Immer wenn Zeichen enthalten sind welche entweder das JSON oder das RegEx kaputt machen könnten, musst du diese entsprechend maskieren.
Hier könnte ein einfaches preg_quote helfen.
Wenn aber Zeichen enthalten sind welche schon im JSON maskiert sein müssen, dann wird es etwas kompliziert.
Hier ein Beispiel:

$TopicFilter = '.*"Topic":"' . preg_quote(substr(json_encode($EventTopic), 1, -1)) . '.*';

EventTopic wird mit json_encode in korrekt als JSON enkodiert.
Da es ein String ist, wird am Anfang und Ende das " abgeschnitten und dass dann mit preg_quote noch für RegEx maskiert.
Michael
PS: richtig vertrakt wird es dann mit Binary Daten… Das lassen wir hier jetzt Mal wech :wink:

1 „Gefällt mir“

Hallo Michael,

das sieht gut aus! Vielen Dank!

Joachim