2016-12-07 140 views
0

我需要多個數據包拆分爲單塊爆炸串並保留分隔符/分隔符在PHP

$packets=" 
*TS01,868323025167807,205004181116,GPS:3;S33.792541;E151.066264;58;347;1.46,STT:202;0,MGR:1555391,ADC:0;13.84;1;38.89;2;4.14,EVT:1#*TS01,868323025167807,205104181116,GPS:3;S33.786623;E151.060349;66;309;1.10,STT:202;0,MGR:1556426,ADC:0;13.78;1;38.70;2;4.14,EVT:1#*TS01,868323025167807,205204181116,GPS:3;S33.779947;E151.052654;47;313;1.10,STT:202;0,MGR:1557577,ADC:0;13.65;1;38.70;2;4.14,EVT:1#*TS01,868323025167807,205304181116,GPS:3;S33.776746;E151.051546;52;346;1.09,STT:202;0,MGR:1557980,ADC:0;13.85;1;38.14;2;4.14,EVT:1#*TS01,868323025167807,205404181116,GPS:3;S33.768219;E151.048295;63;338;1.08,STT:202;0,MGR:1559134,ADC:0;13.62;1;37.95;2;4.14,EVT:1#*TS01,868323025167807,205504181116,GPS:3;S33.763735;E151.047204;0;0;1.08,STT:202;0,MGR:1559699,ADC:0;12.84;1;37.95;2;4.14,EVT:1#*TS01,868323025167807,205518181116,GPS:3;S33.763707;E151.047218;0;0;1.07,STT:2;0,MGR:1559699,ADC:0;12.84;1;37.95;2;4.14,EVT:F0;200#"; 

一個有效的數據包看起來像下面

*TS01,868323025167807,205004181116,GPS:3;S33.792541;E151.066264;58;347;1.46,STT:202;0,MGR:1555391,ADC:0;13.84;1;38.89;2;4.14,EVT:1# 

意味着每個報文開始*和結束與#

我做了以下

$no_of_packets=substr_count($packets, '*'); 
     if($no_of_packets>1){ 
//explode with # 
    $packets=explode("#",$msg) 
} 

我陣列象下面

[0] => *TS01,868323025167807,205004181116,GPS:3;S33.792541;E151.066264;58;347;1.46,STT:202;0,MGR:1555391,ADC:0;13.84;1;38.89;2;4.14,EVT:1 
    [1] => *TS01,868323025167807,205104181116,GPS:3;S33.786623;E151.060349;66;309;1.10,STT:202;0,MGR:1556426,ADC:0;13.78;1;38.70;2;4.14,EVT:1 
    [2] => *TS01,868323025167807,205204181116,GPS:3;S33.779947;E151.052654;47;313;1.10,STT:202;0,MGR:1557577,ADC:0;13.65;1;38.70;2;4.14,EVT:1 
    [3] => *TS01,868323025167807,205304181116,GPS:3;S33.776746;E151.051546;52;346;1.09,STT:202;0,MGR:1557980,ADC:0;13.85;1;38.14;2;4.14,EVT:1 
    [4] => *TS01,868323025167807,205404181116,GPS:3;S33.768219;E151.048295;63;338;1.08,STT:202;0,MGR:1559134,ADC:0;13.62;1;37.95;2;4.14,EVT:1 
    [5] => *TS01,868323025167807,205504181116,GPS:3;S33.763735;E151.047204;0;0;1.08,STT:202;0,MGR:1559699,ADC:0;12.84;1;37.95;2;4.14,EVT:1 
    [6] => *TS01,868323025167807,205518181116,GPS:3;S33.763707;E151.047218;0;0;1.07,STT:2;0,MGR:1559699,ADC:0;12.84;1;37.95;2;4.14,EVT:F0;200 

'#'缺失。如果我去通環路和追加'#'每個數據包將是太慢了,因爲我有1000多個數據包的某個時候

我需要'#'

保持'#「和分裂我試圖從Is there way to keep delimiter while using php explode or other similar functions?的解決方案,但它給最後一個空數組太

+0

[可以保留分隔符,而使用PHP爆炸或其他類似的功能嗎?]可能的重複?(http://stackoverflow.com/questions/2938137/is-there-way-to-keep-delimiter-while-using-php -explode或者其他類似函數) – anon

+0

'這會很慢,因爲我有1000+個pac kages'這個結論,如何?我已經做了兩個答案[http://pastebin.com/0fxAByJN],並得出結論,循環雖然比正則表達式快62.68%。 – Xorifelse

回答

2

最好是設定空隔膜和後面用正面看/向前看分別#字符和任何字符:

$list = preg_split('/(?<=#)(?=.)/', $msg); 

(?<=#)對於#字符是積極向後看,(?=.)對於任何字符都是積極向前看的(這避免了在最後生成空字符串)。

其實,如果*是分離的部分,下面的正則表達式將工作更好(更可靠):

$list = preg_split('/(?<=#)(?=\*)/', $msg); 
+0

(?=。)太棒了 – sumit

0

此代碼將幫助你得到你想要的輸出 -

$arr = explode("*", $packets); 
array_shift($arr); 
$result = array(); 
for($i = 0; $i<count($arr); $i++){ 
array_push($result, "*".$arr[$i]); 
} 
print_r($result); 
+0

我不確定爲什麼這個選項已經倒計時,它可以工作,它應該比執行答案更快。 – Xorifelse