...auf Kriegsfuss mit RegEx und preg_match...

Hallo Leute,
bin hier mit den im Betreff genannten Themen seit Stunden - leider erfolglos - beschäftigt:

$zeichenkette = '16,N,01023.67976,E,1.362,,190917,,,A*73<CR><LF>$GPVTG,,T,,M,1.362,N,2.523,K,A*23<CR><LF>$GPGGA,035931.00,5321.54516,N,01023.67976,E,1,06,1.78,1.4,M,44.8,M,,*5B<CR><LF>$GPGSA,A,3,32,12,24,29,14,25,,,,,,,3.43,1.78,2.93*0D<CR><LF>$GPGSV,3,1,11,02,36,098,17,03,04,350,,06,26,051';
$suchmuster = '/(\$GPVTG))/';
preg_match($suchmuster, $zeichenkette, $treffer);
print_r($treffer);

Was möchte ich:

  • der gesuchte Teilstring beginnt mit „$GPVTG“ ($GPGGA|$GPGSA|$GPVTG)
  • der gesuchte Teilstring endet mit „<CR><LF>“
  • das Ergebnis-Array sollte alle gefunden Treffer auflisten
    Aber so sehr ich auch am „Suchmuster“ experimentiere, bisher kein Erfolg…:frowning:

Hat jemand den entscheidenden Tipp für mich?

Joachim

Probier mal das Suchmuster:


$suchmuster = '/(\$GPVTG)([^(<CR><LF>)]*)(<CR><LF>)/';

So wie ich deine Beschreibung verstehe, sollte das dein gewünschtes Muster sein. Wenn du alle Matches haben möchtest solltest du die Funktion preg_match_all verwenden: PHP: preg_match_all - Manual

Hallo Dr.Niels,

der Tipp war goldrichtig - läuft jetzt!
Vielen Dank!

Joachim

…muss leider noch einmal nachhaken…

Bei meinen Tests in einem PHP-Editor war es wichtig, dass der String ($zeichenkette) in ’ ’ (Hochkomma) gesetzt war " " (Anführungsstriche) führten dazu, dass die ankommenden „$GPVTG“ als Variable gedeutet wurden.

Nun habe ich das in mein GPS-Modul eingebaut und bekomme keine sinnvollen Ergebnisse mehr.
Meine Vermutung: die Nutzung von SetBuffer/GetBuffer ist ein String in " " (Anführungsstriche).
Kann das so sein?
Wie bekomme ich einen String der der Einfassung in ’ ’ (Hochkomma) entspricht?

Joachim

Der Instanz Buffer ist ein String… ganz ohne Anführungszeichen.
Du bekommst eher kein Ergebnis weil <CR><LF> sind bestimmt Steuerzeichen und besteht nicht aus spitzen Klammern und Buchstaben.
Michael

…ich hatte für den Test einen Teil kopiert. So wie man es oben sieht kommt es als Text an. Bei dem Test hat der Ansatz so funktioniert wie Dr.Niels es vorgeschlagen hatte…

Womit kopiert… woraus ?
Aus dem Debug eines IO ?
Der stellt Steuerzeichen ‚leserlich‘ dar.

Michael

Nein, das ist die textliche Übersetzung von Bytes aus einer seriellen Schnittstelle, aber nicht aus dem Debug eines IPS-I/O.
Werde das aber mal prüfen, ob ich durch Veränderung des Suchbegriffes etwas ändere…

…aber: Dein Tipp war (mal wieder) richtig!
Danke!!

Joachim

Bitte :slight_smile:

Bin auch gerade mit RegEx am arbeiten und fluchen. Weil ich ein DHCP & BOOTP Pakete erkennen und unterschieden will.
Am besten so, dass das IPS für mich macht mit RegEx beim Datenempfang.
Daher passte das gerade.

Habe auch 2 Stunden gesucht um meine Fehler zu finden :banghead:
Aber nun funktionier es :smiley:
Auch wenn man sich das Umrechnen der MAC von Klartext erst nach Bin und dann nach JSON nicht genauer ansehen sollte…


        $Mac = substr(json_encode(utf8_encode(hex2bin($Mac)), JSON_UNESCAPED_UNICODE), 1, -1);
        $Filter = '.*\\\\u0001\\\\u0001\\\\u0006.*' . $Mac . '.*';

Bei mir fehlen übrigendes die Backslashs zum maskieren der Backslashs zum maskieren der Binärdaten in JSON.
Na, wenn man da keinen Knoten im Kopf bekommt :rolleyes:

Michael

Meine Lieblingsseite zum Testen: Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript :slight_smile:

paresy

Ja meine auch.
Nur das nachher auf den JSON ReceiveData als Filter umzubauen, da hakt es dann häufiger.
Cool wenn das im Buffer dann auch JSON ist… Dann sieht Mal vor lauter Maskierungszeichen nichts mehr :wink:
Michael

…habe mal wieder so eine „RegEx-Herausforderung“…

Die Datensätze kommen jeweils in geschweiften Klammern. Die Länge innerhalb der geschweiften Klammern ist variabel und kann aus Buchstaben, Zahlen und Trennzeichen bestehen. Ich hätte gerne das Preg_split mir diese geschweiften Klammern samt Inhalt in ein Array aufteilt…

Habe es schon mit so einem Online-Tester versucht - aber selbst da bekomme ich keine passenden Ergebnisse…

Joachim

Ohne Beispieldaten… öhm Glaskugel ?
Michael

„{123;345;rtz}{123;345;rtz}“

Etwas das?

<?php
$txt="{123;345;rtz}{123;345;rtz}";
$myarray=array();
preg_match_all('({[^}]*})',$txt,$myarray);
print_r($myarray);

Für das Aufteilen innerhalb der Klammern ist ein weiterer Match notwendig

Hallo tommi,

vielen Dank für diese Lösung - wäre da selbst im Leben nicht drauf gekommen…:wink:

Joachim