【问题标题】:Explode string and preserve delimiter/seperator in php分解字符串并在 php 中保留分隔符/分隔符
【发布时间】:2016-12-07 04:44:59
【问题描述】:

我需要将多个数据包拆分为单个块

$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? 的解决方案,但它也给出了最后一个空数组

【问题讨论】:

标签: php arrays string explode


【解决方案1】:

最好设置空分隔符,并分别对#字符和任何字符使用正向向后/向前看:

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

(?&lt;=#) 是对# 字符的正向查找,(?=.) 是对任何字符的正向查找(这样可以避免在末尾生成空字符串)。

实际上,如果* 是分隔符的一部分,则以下正则表达式会更好(更可靠):

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

【讨论】:

  • (?=.) 太棒了
【解决方案2】:

此代码将帮助您获得所需的输出 -

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

【讨论】:

  • 我不知道为什么这被否决了,它的工作原理应该比例外答案更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2016-11-26
  • 2022-11-03
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多