2010-12-01 30 views
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) 

由於日期時間標記中的空格,因此在空間上執行簡單拆分不起作用。我知道正則表達式足以知道總是有不同的方式來打破這種情況,所以我認爲獲得一些專家意見會幫助我提出最密不透風的正則表達式。

+0

難道你不只是把它拆分爲「Z」嗎? – castis 2010-12-01 15:53:13

回答

4

如果每個時間戳都將有一個Z在結束時,您可以使用正向後斷言對空間分割只有當它的前面是Z爲:

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

一旦你得到交易,你可以將它們拆分爲|以獲得單個零件。

Codepad link

請注意,如果您的數據具有Z跟着別人的空間以外的任何地方戳,上面的邏輯將失敗。爲了克服比你可以在空間分割只有當它是由一個時間戳模式之前爲:

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

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

1

每個時間戳均要在年底具有Z這樣的「Z」爆炸了。你不需要一個正則表達式。日期只有在一段時間後纔有Z值。

example

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); 

基本上,該記錄查找隨後是Z時間部分(00:00:00)。然後它分裂在下面的空格字符上......

相關問題