0

标题可能会令人困惑,所以我会尽量描述这个问题。这是要解析的文本文件:

server1 2013-08-27 08:42:01

username1   902     1  0 Aug26 ?        00:01:51 Text here

username1  2044     1  0 Jul14 ?        04:54:52 Text here

server2 2013-08-27 08:42:03

username2  2184     1  1 Jul17 ?        10:21:11 Text here

server3 2013-08-27 08:42:05

username3  2225     1  0 Jul17 ?        05:04:25 Text here

server2 2013-08-27 08:42:07

username2 13233     1  0 Jul15 ?        00:15:09 Text here

username2 13233     1  0 Jul15 ?        00:15:09 Text here

server3 2013-08-27 08:42:09

username3  6131     1  0 Jul15 ?        00:22:19 Text here

如您所见,服务器没有任何特定的顺序。我想要实现的是将服务器及其各自的文本位放入数组中。该程序将解析该文件,并且只要找到“server1”,它就会将该行和下面的所有内容放入一个名为“server1”的数组中。当它找到一个具有不同名称的服务器时,它会将所有文本行添加到另一个数组中,例如。“服务器 2”或“服务器 3”。

输出将类似于:

//serverX,其中 X 为 1-99

array(n){
    [0]=> string(n) "serverX ..."
    [1]=> string(n) "usernameX ..."
    [2]=> string(n) "usernameX ..."
    [3]=> string(n) "usernameX ..."
    [4]=> string(n) "serverX ..."
    [5]=> string(n) "usernameX ..."
}

这意味着所有服务器(server1..n)都将有一个数组,其中添加了字符串。

4

1 回答 1

1

我建议为此使用正则表达式。这是一个示例:

//here $sData is incoming plain text data
$rgResult = [];
preg_match_all('/server([^\s]+)\s+([^\r\n]+)(((?!server).)*)/msi', $sData, $rgServers, PREG_SET_ORDER);
foreach($rgServers as $rgMatches)
{
   $rgResult[$rgMatches[1]][] = [
      'date' => $rgMatches[2],
      'list' => array_map(function($sItem)
      {
         return preg_split('/\s+/', $sItem, -1, PREG_SPLIT_NO_EMPTY);
      }, preg_split('/[\r\n]+/', $rgMatches[3], -1, PREG_SPLIT_NO_EMPTY))
   ];
}
//var_dump($rgResult);

我已经看到您使用首选格式进行的编辑,但目前还不清楚(因为您的服务器在您的示例中是相互连接的)。上面的示例将服务器分成数组并将每个日期条目也与用户列表分开放置(假设用户名也排在第一位)。

于 2013-08-27T07:27:49.477 回答