2016-04-28 62 views
2

我有一個腳本實時觀看日誌文件的最後一行。當下面的行出現時。我想提取第二組括號內的數據。我原來的代碼工作正常,問題是日誌輸出已更改。示例日誌輸出:問題解析使用正則表達式提取數據

2016-04-28 16:54:49  INFO [ADMINCGI sid=1] Title updated [Peezy - Dope Fein Baby (Feat. TID Sweeze & H.N.I.C Pesh)] 
2016-04-28 16:54:49  INFO [ADMINCGI sid=1] DJ name updated [1] 

我需要首先確保有關線#1線找到行,如果可能,然後提取裏面第二個括號中的文字。

我使用這一點,但它返回的#2線

我的代碼:

$line ="2016-04-27 22:56:48  INFO [ADMINCGI sid=1] Title updated [Tessa Feat. Gucci Mane - Get You Right]"; 
echo $line; 

$pattern="/\[([^\]]*)\]/"; 

$needle = " Title updated "; 
if (strpos($line,$needle) !== false) { 
preg_match_all($pattern, $line, $matches); 
foreach ($matches[1] as $a){ 

    // echo $a."</br>"; 
    // echo $matches[1][1]; 
    $fulltitle = explode("-", $matches[1][1]); 

    $artist = $fulltitle[0]; 
    $title = $fulltitle[1]; 
    echo $artist; 
+0

爲什麼你迭代一個數組,如果你直接訪問條目?也許我對太多的細節感到煩惱,順便說一下許多在線正則表達式測試可以幫助你測試你的模式。例如http://www.regexr.com/。 – SmasherHell

+1

如果您單獨測試每一行,請嘗試使用['preg_match_all('〜\ [([^] [] *)]〜',$ input,$ m); $ my_val = $ m [1] [1];'](http://ideone.com/jAwAKe) –

+0

@ BuzzzHost.com:有沒有反饋?有什麼建議可以幫你嗎? –

回答

1

我會使用strrpos()函數去,因爲主線是簡單得多比正則表達式來調試

<?php 
$line ="2016-04-27 22:56:48  INFO [ADMINCGI sid=1] Title updated [Tessa Feat. Gucci Mane - Get You Right]"; 
echo $line; 

$match = rtrim(substr($line, strrpos($line, '[') + 1), "]"); 

$fulltitle = explode("-", $match); 

$artist = $fulltitle[0]; 
$title = $fulltitle[1]; 
echo $artist; 

?> 
+1

感謝您的迴應:) –

+0

最後一件事,並感謝您的反饋。這是有效的,並且能夠毫無問題地提取「藝術家」和「歌曲標題」。問題在於腳本持續運行,我需要它在歌曲改變時纔會觸發。每當歌曲改變時,該行將出現在日誌中,除了不同的藝術家和標題。每當歌曲發生變化時,我都會創建一個鳴叫併發送給Twitter。這有效,但會發生什麼呢,它不停地發微博。它應該只在每首歌換一次時完成。 –

+0

2016-04-28 21:39:12 INFO [ADMINCGI sid = 1]標題更新[凱文蓋茨 - 製作愛情(DatPiff Exclusive)] 2016-04-28 21:39:12 INFO [ADMINCGI sid = 1] DJ名稱更新[1] 在歌曲改變之後,上面的第二行被輸出。正則表達式試圖從該行提取數據,因爲[1]我相信。我需要一種專門採用Artist廣告歌名的方式,並忽略其他所有內容。我不是最好的這種東西,所以我道歉,但我需要代碼來說,找到任何內部[]由hypen劃定的任何東西。這是我能想到的兩條線之間的唯一區別。 –