使用php将文本行解析为不同的变量

时间:2012-12-28 15:51:10

标签: php arrays parsing

我是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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

看起来你需要一个正则表达式来分割文本行。 它不是那么容易理解,而是你需要的其他案例所需要的工具。 手册页:http://br2.php.net/manual/en/book.pcre.php

您需要在文本上找到模式。 例如,时间戳总是从行的开头开始,长度是8个字符?