2013-08-27 33 views
0

標題可能會令人困惑,所以我會盡可能描述這個問題。以下是將要解析的文本文件:從某個元素名稱解析文本文件,直到找到使用PHP的另一個文本文件

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」的數組中。當它找到一個名稱不同的服務器時,它會將所有文本行添加到另一個數組中,例如。 「server2」或「server3」。

的輸出中會是類似於:

// 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)將具有一個陣列,其中的字符串是添加到。

+0

有趣的任務,但你到目前爲止嘗試過什麼?明星但不是+1。沒有先看到你的努力,沒有人會完全烤蛋糕 –

+0

你可以發佈你想如何格式化最終數組?我不清楚你是否希望將每一行數據保存爲一個字符串,或者每一小段信息應該位於較大陣列中的數組中,等等。 –

+0

@ØHankyPankyØ我已經在這裏呆了幾天,避難所任何地方都沒有。 – tomtomssi

回答

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); 

我已經看到了首選格式的編輯,但目前還不清楚(因爲不知何故您的服務器是一個在另一個你的樣品中)。上面的示例將服務器分成數組,並將每個日期條目與用戶列表分開放置(假設用戶名也首先出現)。

+0

示例輸出只是我尋找的一個示例。這個伎倆。 – tomtomssi

相關問題