chop и получить значения строки на основе длины PHP

Этот вопрос может показаться немного странным. Я получаю строку из пакета TCP / IP, что-то вроде этого ..

«SiteName»: «GPRSSignalStrength»: «SelectedNetworkOperators»: «GPRSReportingTimeOut»: «SensorReportCount»: «SensorReportUpdateStatus»: «PacketLength»: «SensorStatus»: «SensorReportingInterval»: «SensorType»: «GSM ID»: «Запуск записи», «S2, Main Kitchen KE», «000», «3012», «RSSI», «SensorOpticStatus», «Record end»: «Record start», «S2, Main Kitchen KE», «000», «3012», RSSI "," SensorOpticStatus "," Record end "

Моя цель – получить «SiteName» и все значения, начинающиеся с «GSM ID», в другую строку. Основная проблема заключается в том, что длина пакета может изменяться после блока «Запуск записи» на основе значения «SensorReportCount». если «SensorReportCount» = 2, то мы будем иметь тот же самый пакет, который был скопирован выше, если «SensorReportCount» = 3, тогда у нас будет дополнительный отчет, который будет выглядеть как что-то

«SiteName»: «GPRSSignalStrength»: «SelectedNetworkOperators»: «GPRSReportingTimeOut»: «SensorReportCount»: «SensorReportUpdateStatus»: «PacketLength»: «SensorStatus»: «SensorReportingInterval»: «SensorType»: «GSM ID»: «Запуск записи», «S2, Main Kitchen KE», «000», «3012», «RSSI», «SensorOpticStatus», «Record end»: «Record start», «S2, Main Kitchen KE», «000», «3012», RSSI »,« SensorOpticStatus »,« Record end »:« Record start »,« S2, Main Kitchen KE »,« 000 »,« 3012 »,« RSSI »,« SensorOpticStatus »,« Record end ».

как можно сохранить «Имя сайта» и все остальные блоки после «GSM ID» в другой строке.?

Используйте это регулярное выражение:

 ^(.*?):.*("GSM ID".*)\. 

См. Демо-версию Regex

Используйте preg_match, чтобы получить подматрицы из двух групп захвата. Первая группа захвата предназначена для «SiteName», а вторая – для всего после и «GSM ID».

строка

 $text = '"SiteName":"GPRSSignalStrength":"SelectedNetworkOperators":"GPRSReportingTimeOut":"SensorReportCount":"SensorReportUpdateStatus":"PacketLength":"SensorStatus":"SensorReportingInterval":"SensorType":"GSM ID":"Record start","S2, Main Kitchen KE","000","3012,"RSSI","SensorOpticStatus","Record end":"Record start","S2, Main Kitchen KE","000","3012,"RSSI","SensorOpticStatus","Record end"'; 

PHP Regular Expresion

 $pattern = '[^(.+?:).+("GSM ID":.+)]'; preg_match_all($pattern, $text, $out); 

Для шаблона вам нужно использовать + not * cause, + check для 1 или более, что означает, если он найден.

результат

 Array ( [0] => Array ( [0] => "SiteName":"GPRSSignalStrength":"SelectedNetworkOperators":"GPRSReportingTimeOut":"SensorReportCount":"SensorReportUpdateStatus":"PacketLength":"SensorStatus":"SensorReportingInterval":"SensorType":"GSM ID":"Record start","S2, Main Kitchen KE","000","3012,"RSSI","SensorOpticStatus","Record end":"Record start","S2, Main Kitchen KE","000","3012,"RSSI","SensorOpticStatus","Record end" ) [1] => Array ( [0] => "SiteName": ) [2] => Array ( [0] => "GSM ID":"Record start","S2, Main Kitchen KE","000","3012,"RSSI","SensorOpticStatus","Record end":"Record start","S2, Main Kitchen KE","000","3012,"RSSI","SensorOpticStatus","Record end" ) ) 

Результат будет таким же, как и конкатенация индекса массива 1 и 2.

PHP Explode

 $arr = explode(':"GSM ID"', $text); echo '"SiteName":"GSM ID"'.$arr[1]; 

Вывод:

«SiteName»: «GSM ID»: «Запуск записи», «S2, Main Kitchen KE», «000», «3012», «RSSI», «SensorOpticStatus», «Record end»: «Record start», «S2, «Основная кухня KE», «000», «3012», «RSSI», «SensorOpticStatus», «Record end»