1

私はphpに非常に慣れていないので、一見単純な質問で申し訳ありません。テキスト行をさまざまな変数に解析する必要があります。より具体的には、さまざまな配列にある多数のテキスト行を解析する必要があります。テキスト行は次のようになります

timeStamp UserName* garbage text Number x item*
timeStamp UserName* garbage text Number x item*
timeStamp UserName* garbage text Number x item*

userName と item の両方にスペースを含めることができます。これを行う最善の方法は、4つの異なるアレイになると思いますか?

実際のデータは次のようになります

03:12:34 mhopkins321 has acquired 5 x bottles of water
09:38:01 Nick Smith has acquired 100 x pennies
23:22:59 Fancy Frank has acquired 15684 x artichoke hearts

したがって、配列は次のようになると思います

$timeStamp         $userName        $amount     $items
03:12:34           mhopkins321      5           bottles of water
09:38:01           Nick Smith       100         pennies
23:22:59           Fancy Frank      15684       artichoke hearts
4

2 に答える 2

2

これは、機械による解析には非常に不適切な形式です。特に問題となるのは、名前にスペースが含まれる可能性があるが、区切られていないことです。

これを解析する唯一の確実な方法は、名前と金額の間に現れる可能性のあるすべての「ガベージ テキスト」文字列を知ることです。完全なリストがない限り、ユーザー名を台無しにする可能性があります。

explode()行を配列に分割してから部分を抽出することで、これを解析することができます。ただし、正規表現を使用するだけでよいと思います。

$sample = "
03:12:34 mhopkins321 has acquired 5 x bottles of water
09:38:01 Nick Smith has acquired 100 x pennies
23:22:59 Fancy Frank has acquired 15684 x artichoke hearts
";

$re = '/^(?<timeStamp>[0-9]{2}:[0-9]{2}:[0-9]{2}) # timestamp 
         \s+
         (?<userName>[\w\s]+)        # user name
         \s+(?:has\s+acquired)\s+    # garbage text between name and amount
         (?<amount>\d+)              # amount
         \s+x\s+                     # multiplication symbol
         (?<items>.*)\s*$            # item name (to end of line)
       /xmu';

preg_match_all($re, $sample, $matches, PREG_SET_ORDER);

var_export($matches);
于 2012-12-28T16:24:09.257 に答える
2

テキスト行を分割するには正規表現が必要なようです。理解するのはそれほど簡単ではありませんが、あなたが関連したこのような他のケースに必要なツールです. マニュアルページ: http://br2.php.net/manual/en/book.pcre.php

テキストのパターンを見つける必要があります。たとえば、タイムスタンプは常に行頭から始まり、長さは 8 文字ですか?

于 2012-12-28T16:24:54.713 に答える