【问题标题】:Any Elegant Ideas on how to parse this Dataset?关于如何解析这个数据集的任何优雅的想法?
【发布时间】:2011-05-18 14:10:24
【问题描述】:

我正在使用 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”分割它?
  • 是的,我认为你现在有两个问题。在我想的“Z”上爆炸。

标签: php regex parsing


【解决方案1】:

如果每个时间戳最后都有一个Z,那么只有当它前面有一个Z 时,您才可以使用肯定的后向断言来分割空间:

$transaction = preg_split('/(?<=Z) /',$input);

获得交易后,您可以在| 上拆分它们以获取各个部分。

Codepad link

请注意,如果您的数据有一个Z 后跟一个空格而不是时间戳,则上述逻辑将失败。要克服的问题,只有在时间戳模式前面为以下时才能在空间上拆分:

$transaction = preg_split('/(?<=\d\d:\d\d:\d\dZ) /',$input);

【讨论】:

    【解决方案2】:

    正如其他人所说,如果您确定在日期以外的任何地方都没有 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。然后它在下面的空白字符上分裂......

    【讨论】:

      【解决方案3】:

      每个时间戳都将在末尾有一个 Z,因此将其分解为“Z”。您不需要正则表达式。日期不可能只有时间后面有 Z。

      example

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多