关于如何解析这个数据集的任何优雅想法?

时间:2010-12-01 15:50:43

标签: php regex parsing

我正在使用PHP 5.3从Web服务调用接收数据集,该调用会返回有关一个或多个事务的信息。每个事务的返回值由管道(|)分隔,事务的开始/结束由空格分隔。

2109695|49658|25446|4|NSF|2010-11-24 13:34:00Z 2110314|45276|26311|4|NSF|2010-11-24 13:34:00Z 2110311|52117|26308|4|NSF|2010-11-24 13:34:00Z (etc)

由于日期时间戳中的空格,对空间进行简单拆分不起作用。我知道正则表达式很好,知道总有不同的方法可以解决这个问题,所以我想获得一些专家意见可以帮助我提出最密集的正则表达式。

4 个答案:

答案 0 :(得分:4)

如果每个时间戳最后都有一个Z,那么只有当Z前面有一个$transaction = preg_split('/(?<=Z) /',$input); 时才能使用正向后看断言进行分割:

|

获得交易后,您可以将其拆分为Z以获取各个部分。

Codepad link

请注意,如果您的数据$transaction = preg_split('/(?<=\d\d:\d\d:\d\dZ) /',$input); 后面跟着时间戳以外的其他位置,则上述逻辑将失败。要克服这个问题,只有在时间戳模式之前才能分割空间:

{{1}}

答案 1 :(得分:1)

使用explode('|', $data)功能

答案 2 :(得分:1)

每个时间戳最后都会有一个Z,所以用'Z'爆炸它。您不需要正则表达式。只有时间之后,日期才有可能是Z.

example

答案 3 :(得分:1)

正如其他人所说,如果您确定在日期之外的任何地方都不会有Z个字符,那么您可以这样做:

$records = explode('Z', $data);

但如果你把它们放在其他地方,你就需要做一些更有趣的事情。

$regex = '#(?<=\d{2}:\d{2}:\d{2}Z)\s#i';
$records = preg_split($regex, $data, -1, PREG_SPLIT_NO_EMPTY);

基本上,该记录会查找时间部分(00:00:00),后跟Z。然后它分裂在下面的空格字符上......