2010-08-16 80 views
0

一些數據,我需要能夠分析這種數據的PHP:需要幫助解析PHP中

Acct: 1 
email  : [email protected] 
status  : online 
-------------------------------------------------- 

Acct: 2 
email  : [email protected]  
status  : banned 
-------------------------------------------------- 

Acct: 3 
signedupname : SomeUsername  
somethingelse : offline 
-------------------------------------------------- 

正如你所看到的數據是很大程度上是隨機的。唯一保持不變的是-----分隔每個條目和Acct: 1位。每個:之間的填充值通常隨着表示每一位數據的變量而變化。

我已經嘗試過使用正則表達式解析它,但我確實不夠熟練,無法正確執行。在這個結尾,我想根據以下數據:

Acct: <integer> 
var1: <string> 
var2: <string> 

如果這是有道理的。它不需要那麼有效,因爲我需要每天做一次這樣的事情,我不介意等待它需要的時間。

謝謝。 :)

編輯:這是我做我自己:

<?php 

$data = file_get_contents('records.txt'); 
$data = explode('******** Saved Host list with acct/variables ********', $data); 
$data = explode('--------------------------------------------------', $data[1]); 

foreach($data as &$dataz) 
{ 
    $dataz = trim($dataz); 
} 

$data = str_replace('Acct:', "\nAcct:", $data); 

foreach($data as $dataz) 
{ 
    preg_match('/Acct: (.*)/', $dataz, $match); 
    $acct = $match[1]; 
    preg_match('/: (.*)/', $dataz, $match); 
    $var1 = $match[1]; 
    echo $var1; 
} 

?> 

我得到儘可能提取Acct:一部分,但任何超出我根本不在身邊讓我的頭。

+1

如果您顯示迄今爲止所做的工作,它會有所幫助。如果你能向他們展示你的努力,人們更願意提供幫助。 – 2010-08-16 23:18:41

+0

當然啊。我會編輯我的OP。 – Kratz 2010-08-16 23:20:33

+0

如果破折號行只包含三個破折號,即'---',那麼它將是有效的[YAML](http://yaml.org) – Joey 2010-08-16 23:25:59

回答

1

這段代碼將整個輸入並在您輸入的每個記錄關聯數組:

// replace ----- with actual number of dashes 
foreach (explode('-----', $input) as $entry) { 
    $entry = trim($entry); 
    $record = array(); 
    foreach (explode("\n", $entry) as $line) { 
    $parts = explode(':', $line); 
    $varname = trim($parts[0]); 
    $value = trim($parts[1]); 
    $record[$varname] = $value; 
    } 
    // Do anything you want with $record here 
} 

編輯:我只是看看你發佈的代碼。你真的不需要正規表達式來處理你想要做的事情。在正確的地方使用正則表達式可以非常方便,但大多數情況下,這是不正確的。

+0

非常好,謝謝。唯一的問題是,有時帳戶有一個URL,例如「http:// google.com」,您的代碼塊爆炸,從而使輸出變得怪異。但我可以更有可能解決這個問題。 謝謝! :) – Kratz 2010-08-16 23:35:42

+0

您可以將限制參數傳遞給'explode',只是使它爆炸(':',$ line,2)',它只會將它分成兩部分。 – casablanca 2010-08-17 00:18:08