2016-04-26 109 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上面的技巧.. –

相關問題