2011-12-03 40 views
2

我從日誌文件中得到以下摘錄,並且必須抓取'NC:'和'VL#'或'迄今爲止的總違規級別#'之間的所有內容。考慮到長度未知並且沒有簡單的分隔符,我怎麼能夠抓住該字符串?解析PHP中的未知字符串長度?

11.11.27 14:50:41 [警告] NC:elvefromhell失敗fight.noswing:沒有擺動手臂。 VL 3

11.11.27 14:50:54 NC:Jackmac19失敗fight.direction:試圖攻擊視線實體。迄今爲止的總違規等級5.

11.11.27 14:51:02 [警告] NC:錯誤6968失敗chat.spam:上次發送消息「t」。 VL 1

11.11.27 14:51:26 [警告] NC:相信失敗的chat.spam:上次發送的消息「hi pherce」。 VL 1

11.11.27 14:51:48 [警告] NC:UmbraSprite失敗blockbreak.noswing:沒有搖擺手臂。 VL 2

11.11.27 14:51:59 [信息] NC:AwayDood失敗moving.running.vertical。 VL 2

11.11.27 14:52:17 [信息] NC:AwayDood失敗moving.running.vertical。 VL 11

11.11.27 14:52:35 [信息] NC:AwayDood失敗moving.running.vertical。 VL 11

11.11.27 14:53:06 [警告] NC:AwayDood失敗blockbreak.noswing:沒有擺動手臂。 VL 4

回答

3

使用正則表達式:

$text = '11.11.27 14:50:54 [INFO] NC: Jackmac19 failed fight.direction: tried to attack out of sight entity. Total violation level so far 5.'; 

preg_match('/NC: (.*)?\s(VL|Total violation level so far)/', $text, $matches); 
echo $matches[1]; 

這將在時間上的一個線操作。它可以在更大的日誌上工作,但是一次處理日誌一行看起來更加健壯。

See it in action

+0

這是完美的!謝謝! –

0

這是快速和粗糙的,但工作給予日誌。如果您的日誌文件格式發生變化,請小心。

preg_match_all('/NC: (.*?) (?:VL|Total violation level so far)/i', $subject, $result); 
+0

差不多...但Jon在這種情況下效果更好,因爲我已經在遍歷日誌文件。格式不應該改變,但如果它確實更新了腳本。 –

0

不使用正則表達式,你可以只用NC分裂:

foreach($lines as $line){ 
    list(,$text) = explode('NC:',$line); 
    print $line; 
} 
0

,不使用正則表達式(下面的代碼可以優化,但我已經離開像這樣使它更清楚什麼正在發生):

$end = strlen($string); 
if(false !== strpos($string, 'VL ')) { 
    $end = strpos($string, 'VL '); 
} else if(false !== strpos($string, 'Total violation level so far ')) { 
    $end = strpos($string, 'Total violation level so far '); 
} 

$string = substr($string, strpos($string, 'NC: '), $end); 

$string將包含一行日誌文件。要獲取日誌文件的所有線陣列,以方便這一點,你會做這樣的事情:

$lines = file('/path/to/file.ext'); 
0

您可以嘗試的正則表達式(正則表達式):

/NC:(.*)(?=VL|Total violation level so far)/