2016-04-26 68 views
1

这个问题可能看起来有点怪异启动,它从昨天起一直在不停地吹拂我的心灵。我正在从TCP/IP数据包一个字符串,它是这样的..砍,并获得基于长度的字符串的值PHP

的 “网站名称”: “GPRSSignalStrength”: “SelectedNetworkOperators”: “GPRSReportingTimeOut”: “SensorReportCount”: “SensorReportUpdateStatus”: “PacketLength” :“SensorStatus”:“SensorReportingInterval”:“SensorType”:“GSM ID”:“Record start”,“S2,Main Kitchen KE”,“000”,“3012”,“RSSI”,“SensorOpticStatus”结束 “:” 记录 开始 “ ”S2,主营厨房 KE“, ”000“, ”3012,“ RSSI”, “SensorOpticStatus”, “记录结束”

我的目标是让“ SiteName“和所有的值从“GSM ID”切换到另一个字符串。主要问题是基于“SensorReportCount”值的“记录开始”块之后,数据包的长度可能会有所不同。如果“SensorReportCount” = 2,那么我们将有上面如果“SensorReportCount” = 3,那么我们将有一个额外的报告,其中将看起来像的东西复制相同的数据包

的“网站名称”:“GPRSSignalStrength”:“SelectedNetworkOperators “:”GPRSReportingTimeOut“:”SensorReportCount“:”SensorReportUpdateStatus“:”PacketLength“:”SensorStatus“:”SensorReportingInterval“:”SensorType“:”GSM ID“:”记录开始“,”S2,主厨房 KE“, “000”,“3012”,“RSSI”,“SensorOpticStatus”,“记录结束”:“记录 开始”,“S2,主厨房 KE”,“000”,“3012”,RSSI“,”SensorOpticStatus“ “记录结束”:“记录 开始”,“S2,主厨房 KE”,“000”,“3012,”RSSI“,”SensorOpticStatu s“,”录音结束“。

在“GSM ID”之后的另一个字符串中,如何保存“站点名称”和所有其他块?

+0

你的欲望输出是什么?它会是什么样子? –

+0

我想要这样的欲望输出 '“SiteName”:“GSM ID”:“记录开始”,“S2,主厨房KE”,“000”,“3012”,RSSI“,”SensorOpticStatus“记录开始“,”S2,主厨房KE“,”000“,”3012,“RSSI”,“SensorOpticStatus”,“记录结束”:“记录开始”,“S2,主厨房KE” “000”,“3012,”RSSI“,”SensorOpticStatus“,”记录结束“ –

+0

所以你想跳过其他的话.... –

回答

0

使用这个表达式:

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

Regex Demo

使用preg_match从两个捕获组获得子匹配。第一个捕获组用于“SiteName”,第二个捕获组用于“GSM ID”之后的所有内容。

+0

字符串的长度根据“SensorReportCount”元素而异..你是否会做的伎俩 –

+0

“替代”文本区域中的内容是否与您预期的不同?在正则表达式演示中。 –

+0

aha我的坏...是的,它看起来像工作正常...感谢哥们... –

0

字符串

$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正规表示

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

对于需要使用+*事业的格局,+检查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爆炸

$arr = explode(':"GSM ID"', $text); 

echo '"SiteName":"GSM ID"'.$arr[1]; 

输出:

“网站名”: “GSM ID”: “记录开始”, “S2,主厨房 KE”,“000 “”,“3012”,“RSSI”,“SensorOpticStatus”,“Record end”:“Record start”,“S2,Main Kitchen KE”,“000”,“3012”,“RSSI”结束“

+0

如果我知道字符串的静态长度,我会这样做,但主要问题是字符串的长度因“sensorReportCount”而异,所以我认为我们必须把它放在循环中或东西..但我不知道如何。 –

+0

所以你需要举一个最坏的例子。 –

+1

与正则表达式,它会做的@lbarros上面的技巧.. –

相关问题