2016-12-07 102 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

相关问题