2010-12-01 13 views
3

PHP 5.3を使用して、1つまたは複数のトランザクションに関する情報を返す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

+0

ええ、今は2つの問題があると思います。 「Z」と思って爆発する – Keng

答えて

4

各タイムスタンプは、あなたのようにそれはZが先行しています場合にのみスペースに分割するために正の後読みアサーションを使用することができます最後にZ持ってしようとしている場合:あなたが得れば

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

をトランザクション、あなたは|にそれらを分割することができます個々の部分を取得します。

Codepad link

あなたのデータはZはどこか他の他のタイムスタンプよりスペースが続いている場合、上記のロジックは失敗することに注意してください。他の人が言ったように、あなたは、日中以外の場所何Z文字がないことを確認するために知っていれば、

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

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

1

各タイムスタンプはそう「Z」でそれを爆発最後にZを持っているとしています。正規表現は必要ありません。時間の後に日付がZだけ続くことはありません。

example

1

:あなたは、それは次のようにタイムスタンプパターンが先行しています場合にのみスペースに分割することができるよりも克服するために、できるだけする:

$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)を探し。次に、次の空白文字を分割します。

関連する問題