PHP: Parsen bzw. Alternative zu split -> join -> split

Hallo,
ich habe nun über eine Registervariable die Antworten der Sonos Geräte empfangen und (ich denke) korrekt zerlegt in einzelne Requests (um diese später weiterzuverarbeiten). :smiley:

Der Code dazu ist leider nicht schön und ich denke es geht bestimmt einfacher - ich habe leider keine Idee wie man sowas am Besten macht (das mit dem „split -> implode -> explode“ müsste man doch eigentlich wesentlich besser und eleganter lösen können, oder?)? :mad::confused:

<?
// br_ips: br_sonos_test_regvar (for sonos upnp events)
// Test / Example script for PHPSonos

// Include br_ips Libs here for IPSLogger
require ("functions.inc.php");

$RegVarID = $IPS_INSTANCE;
$newdata = $IPS_VALUE;


// fetch data in buffer
$data = RegVar_GetBuffer ( $RegVarID );

// add received data
$data .= $newdata;

echo "!!!!".strpos($data,"NOTIFY / HTTP/1.1")."!!!".strpos($data,"<e:propertyset xmlns")."!!!".strpos($data,"</e:propertyset>");
// write back data to variable for use in other scripts if not complete
if((strpos($data,"HTTP/1.1")!==FALSE)&&(strpos($data,"<e:propertyset xmlns")!==FALSE)&&(strpos($data,"</e:propertyset>")!==FALSE))
{

$split = preg_split('!<\/e:propertyset>!', $data);
$join = implode("</e:propertyset>DummySEP",$split);
$split = explode ("DummySEP", $join);
$ausgabe = $split;



  $datei = fopen("_subscribe.txt","a+");
  fwrite($datei,"
--SOM--------------------------------------------------!
");
foreach ($ausgabe as $item){
// output only 2 test elems
  $datei = fopen("_subscribe.txt","a+");
  fwrite($datei,"
------------BEG: 
". $item ."
--------------!END
");
}
  fwrite($datei,"
--------------------------------------------------EOM--!
");
  fclose($datei);




} else
{
RegVar_SetBuffer($RegVarID, $data);
}

?> 

Ausgabe (Beispiel):


--SOM--------------------------------------------------!

------------BEG: 
NOTIFY / HTTP/1.1
HOST: 192.168.0.5:6666
CONTENT-TYPE: text/xml
CONTENT-LENGTH: 5707
NT: upnp:event
NTS: upnp:propchange
SID: uuid:RINCON_000E5832FB5C01400_sub0000006347
SEQ: 0

<e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0"><e:property><LastChange><Event xmlns="urn:schemas-upnp-org:metadata-1-0/AVT/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/"><InstanceID val="0"><TransportState val="PLAYING"/><CurrentPlayMode val="NORMAL"/><CurrentCrossfadeMode val="0"/><NumberOfTracks val="3"/><CurrentTrack val="2"/><CurrentSection val="0"/><CurrentTrackURI val="x-rincon-mp3radio://stream.antenne.com/hra-nds/mp3-64/tunein/"/><CurrentTrackDuration val="0:00:00"/><CurrentTrackMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;sonos.com-http:*:*:*&quot;&gt;x-sonosapi-stream:s116053?sid=254&amp;amp;flags=32&lt;/res&gt;&lt;r:streamContent&gt;Ville Valo &amp;amp; Natalia Avelon - Summer Wine | Hit-Radio Antenne &lt;/r:streamContent&gt;&lt;r:radioShowMd&gt;&lt;/r:radioShowMd&gt;&lt;upnp:albumArtURI&gt;/getaa?s=1&amp;amp;u=x-sonosapi-stream%3as116053%3fsid%3d254%26flags%3d32&lt;/upnp:albumArtURI&gt;&lt;dc:title&gt;x-sonosapi-stream:s116053?sid=254&amp;amp;flags=32&lt;/dc:title&gt;&lt;upnp:class&gt;object.item&lt;/upnp:class&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><r:NextTrackURI val="aac://hra.hoerradar.de/aac-48_hra-nds#4ro1n49s|0|0|gharva|nnp-48|uen-aqf"/><r:NextTrackMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;aac:*:application/octet-stream:*&quot;&gt;aac://hra.hoerradar.de/aac-48_hra-nds#4ro1n49s|0|0|gharva|nnp-48|uen-aqf&lt;/res&gt;&lt;dc:title&gt;aac-48_hra-nds#4ro1n49s|0|0|gharva|nnp-48|uen-aqf&lt;/dc:title&gt;&lt;upnp:class&gt;object.item&lt;/upnp:class&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><r:EnqueuedTransportURI val="x-sonosapi-stream:s116053?sid=254&amp;flags=32"/><r:EnqueuedTransportURIMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;Hit-Radio Antenne&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.audioItem.audioBroadcast&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;SA_RINCON65031_&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><PlaybackStorageMedium val="NETWORK"/><AVTransportURI val="x-sonosapi-stream:s116053?sid=254&amp;flags=32"/><AVTransportURIMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;Hit-Radio Antenne&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.audioItem.audioBroadcast&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;SA_RINCON65031_&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><CurrentTransportActions val="Play, Stop, Pause, Seek, Next, Previous"/><TransportStatus val="OK"/><r:SleepTimerGeneration val="0"/><r:AlarmRunning val="0"/><r:SnoozeRunning val="0"/><r:RestartPending val="0"/><TransportPlaySpeed val="NOT_IMPLEMENTED"/><CurrentMediaDuration val="NOT_IMPLEMENTED"/><RecordStorageMedium val="NOT_IMPLEMENTED"/><PossiblePlaybackStorageMedia val="NONE, NETWORK"/><PossibleRecordStorageMedia val="NOT_IMPLEMENTED"/><RecordMediumWriteStatus val="NOT_IMPLEMENTED"/><CurrentRecordQualityMode val="NOT_IMPLEMENTED"/><PossibleRecordQualityModes val="NOT_IMPLEMENTED"/><NextAVTransportURI val="NOT_IMPLEMENTED"/><NextAVTransportURIMetaData val="NOT_IMPLEMENTED"/></InstanceID></Event></LastChange></e:property></e:propertyset>
--------------!END

------------BEG: 
NOTIFY / HTTP/1.1
HOST: 192.168.0.5:6666
CONTENT-TYPE: text/xml
CONTENT-LENGTH: 5707
NT: upnp:event
NTS: upnp:propchange
SID: uuid:RINCON_000E5832FB5C01400_sub0000006351
SEQ: 0

<e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0"><e:property><LastChange><Event xmlns="urn:schemas-upnp-org:metadata-1-0/AVT/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/"><InstanceID val="0"><TransportState val="PLAYING"/><CurrentPlayMode val="NORMAL"/><CurrentCrossfadeMode val="0"/><NumberOfTracks val="3"/><CurrentTrack val="2"/><CurrentSection val="0"/><CurrentTrackURI val="x-rincon-mp3radio://stream.antenne.com/hra-nds/mp3-64/tunein/"/><CurrentTrackDuration val="0:00:00"/><CurrentTrackMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;sonos.com-http:*:*:*&quot;&gt;x-sonosapi-stream:s116053?sid=254&amp;amp;flags=32&lt;/res&gt;&lt;r:streamContent&gt;Ville Valo &amp;amp; Natalia Avelon - Summer Wine | Hit-Radio Antenne &lt;/r:streamContent&gt;&lt;r:radioShowMd&gt;&lt;/r:radioShowMd&gt;&lt;upnp:albumArtURI&gt;/getaa?s=1&amp;amp;u=x-sonosapi-stream%3as116053%3fsid%3d254%26flags%3d32&lt;/upnp:albumArtURI&gt;&lt;dc:title&gt;x-sonosapi-stream:s116053?sid=254&amp;amp;flags=32&lt;/dc:title&gt;&lt;upnp:class&gt;object.item&lt;/upnp:class&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><r:NextTrackURI val="aac://hra.hoerradar.de/aac-48_hra-nds#4ro1n49s|0|0|gharva|nnp-48|uen-aqf"/><r:NextTrackMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;aac:*:application/octet-stream:*&quot;&gt;aac://hra.hoerradar.de/aac-48_hra-nds#4ro1n49s|0|0|gharva|nnp-48|uen-aqf&lt;/res&gt;&lt;dc:title&gt;aac-48_hra-nds#4ro1n49s|0|0|gharva|nnp-48|uen-aqf&lt;/dc:title&gt;&lt;upnp:class&gt;object.item&lt;/upnp:class&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><r:EnqueuedTransportURI val="x-sonosapi-stream:s116053?sid=254&amp;flags=32"/><r:EnqueuedTransportURIMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;Hit-Radio Antenne&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.audioItem.audioBroadcast&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;SA_RINCON65031_&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><PlaybackStorageMedium val="NETWORK"/><AVTransportURI val="x-sonosapi-stream:s116053?sid=254&amp;flags=32"/><AVTransportURIMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;Hit-Radio Antenne&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.audioItem.audioBroadcast&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;SA_RINCON65031_&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><CurrentTransportActions val="Play, Stop, Pause, Seek, Next, Previous"/><TransportStatus val="OK"/><r:SleepTimerGeneration val="0"/><r:AlarmRunning val="0"/><r:SnoozeRunning val="0"/><r:RestartPending val="0"/><TransportPlaySpeed val="NOT_IMPLEMENTED"/><CurrentMediaDuration val="NOT_IMPLEMENTED"/><RecordStorageMedium val="NOT_IMPLEMENTED"/><PossiblePlaybackStorageMedia val="NONE, NETWORK"/><PossibleRecordStorageMedia val="NOT_IMPLEMENTED"/><RecordMediumWriteStatus val="NOT_IMPLEMENTED"/><CurrentRecordQualityMode val="NOT_IMPLEMENTED"/><PossibleRecordQualityModes val="NOT_IMPLEMENTED"/><NextAVTransportURI val="NOT_IMPLEMENTED"/><NextAVTransportURIMetaData val="NOT_IMPLEMENTED"/></InstanceID></Event></LastChange></e:property></e:propertyset>
--------------!END

Habt ihr vieleicht eine Idee? :o

Grüße, Benjamin

Das geht doch mit nem Cutter in IPS viel einfacher - müsst Ihr mir dochmal sagen! :slight_smile:

Selber finden macht doch viel mehr Spaß.:smiley: