如何优雅地解析这个数据集?

3

我正在使用 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)

对空格进行简单的分割是不可行的,因为日期时间戳中有空格。我知道正则表达式足够好,可以用不同的方式拆分它,所以我想得到一些专家意见,以帮助我想出最牢固的正则表达式。


你能不能只按照“Z”来分割它? - castis
是的,我认为你现在有两个问题。我想要在“Z”上分裂。 - Keng
4个回答

4
如果每个时间戳结尾都带有Z,则可以使用正向回顾断言来仅在前面有Z的情况下按空格拆分,如下所示:
$transaction = preg_split('/(?<=Z) /',$input);

一旦您获得了交易记录,您可以在|上进行拆分以获取各个部分。

Codepad链接

请注意,如果您的数据中除时间戳外在任何其他位置都有一个跟随空格的Z,上述逻辑将失败。为了克服这个问题,您可以仅在其前面是时间戳模式的情况下才在空格上进行拆分。
$transaction = preg_split('/(?<=\d\d:\d\d:\d\dZ) /',$input);

1

使用explode('|', $data)函数


1
每个时间戳都会在结尾处有一个 Z ,因此可以通过“Z”将其拆分。 您不需要正则表达式。 日期后面可能没有 Z ,仅限于时间。

示例


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。然后在以下空格字符上进行拆分...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接