2016-04-26 5 views
1

この質問は昨日から私の心を吹き飛ばしているかもしれません。私はこのようなものであるTCP/IPパケットから文字列を取得しています。..長さに基づいて文字列を切り詰めて値を取得するPHP

"サイト名": "GPRSSignalStrength": "SelectedNetworkOperators": "GPRSReportingTimeOut": "SensorReportCount": "SensorReportUpdateStatus": "PacketLength" "SensorStatus": "SensorStatus": "SensorReportingInterval": "SensorType": "GSM ID": "レコード開始"、 "S2、メインキッチン KE"、 "000"、 "3012、" RSSI "、" SensorOpticStatus "、" Recordエンド ":" 録音 スタート " "S2、メインキッチン KE"、 "000"、 "3012、" RSSI"、 "SensorOpticStatus"、 "録画終了"

私の目的は、「取得することですSiteName "とすべての値sta 「GSM ID」から別の文字列に移動します。主な問題は、パケットの長さが "SensorReportCount"値に基づいて "Record start"ブロックの後で変化する可能性があることです。 「GPRSSignalStrength」: "SelectedNetworkOperators = 2「SensorReportCount」は、その後、我々は= 3「SensorReportCount」場合は、上記コピーされた同じパケットを持っていますならば、我々は

「サイト名」何か

ようになり、余分なレポートを持っています":" 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 "、" 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"、 "Record end"、 –

+0

他の単語をスキップしたいので.... –

答えて

0

使用この正規表現:

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

2つのキャプチャグループからサブマッチを取得するためにRegex Demo

使用preg_matchを参照してください。最初のキャプチャグループは "SiteName"用で、2番目のキャプチャグループは "GSM ID"の後のすべてのものです。あなたが+ない*原因、見つかった場合は意味1以上+チェックを使用する必要があるパターンについては

+0

文字列の長さは、 "SensorReportCount"要素に基づいて異なります。 –

+0

"置換"テキスト領域のコンテンツは、期待どおりのものではありませんか?Regexのデモでは、 –

+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正規Expresion

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

。配列インデックス1と2を連結した後

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" 
     ) 

) 

結果は、結果は同じになります。

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 "、" SensorOpticStatus "、" Record末尾 "

+0

文字列の静的長さを知っていれば、私はそれを行いますが、主な問題は "sensorReportCount"に基づいて文字列の長さが異なることです。何か..しかし、私はどのように知っているのですか? –

+0

なので、最悪の例を挙げる必要があります。 –

+1

正規表現でそれは@lbarrosが上に投稿するトリックを行うでしょう –

関連する問題