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 回答