2016-02-25 3 views
0

Так что я пытаюсь проанализировать TXT-файл, который имеет следующий формат. Каждая запись находится в одной строке.Комплексный синтаксический анализ текстового файла в PHP

sample.txt

2016-02-24 13:54:23 Local0.Info 172.16.120.4 1 1456311263.500015263 ASD_MX600 urls src=172.16.41.15:62490 dst=144.76.76.148:80 mac=00:1B:0D:63:84:00 user=CN=Smith\John,OU=S-HS,OU=SAcc,DC=abc,DC=org,DC=ab agent='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 seb/2.0 SEBKEY' request: GET http://something.com/theme/image.php/clean/page/1455532301/icon 

2016-02-24 13:54:23 Local0.Info 172.16.120.4 1 1456311263.500097075 ASD_MX600 urls src=172.16.41.15:62485 dst=144.76.76.148:80 mac=00:1B:0D:63:84:00 user=CN=Smith\John,OU=S-HS,OU=SAcc,DC=abc,DC=org,DC=ab agent='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 seb/2.0 SEBKEY' request: GET http://somethingelse.com/theme/image.php/clean/core/1455532301/f/pdf-24 

мне нужно сделать следующее:
1. Разбираем весь файл в массив. // DONE
2. Подберите все после 1 145 ... (что будет в [3] массива) и проанализируйте его дальше, чтобы у меня были следующие разбивки.
- URLs
- SRC = 172.16.41.15: 62490
- ДСТ = 144.76.76.148: 80
- макинтош = 00: 1B: 0D: 63: 84: 00
- пользователь = CN = Smith \ John , OU = S-HS, OU = SAcc, DC = abc, DC = org, DC = ab
- agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 36.0) Gecko/20100101 seb/2.0 SEBKEY'
- запрос: GET
- http://something.com/theme/image.php/clean/page/1455532301/icon

Я имею трудное время получить правильный синтаксис для 2-го разбора в основном цикле. Я получаю весь гигантский раздел из индекса 3 [3], и я думаю, что я также использую метод explode(), чтобы отрубить его на основе «», но потом я потерялся. Как я могу получить данные, как показано выше? Прогресс Мой код до сих пор:

<?php 

$txt_file = file_get_contents('C:\sample.txt'); 
$rows  = explode("\n", $txt_file); 
array_shift($rows); 

foreach($rows as $row => $data) 
{ 
    //get row data 
    $row_data = explode(' ', $data); //chop each row first based on bigger space 

    //-------------------------- 
    $info[$row]['timestamp']   = $row_data[0]; 
    // $info[$row]['localinfo']   = $row_data[1]; 
    $info[$row]['ip'] = $row_data[2]; 
    $info[$row]['other']  = $row_data[3]; //This is where LONGEST string exists 
    //-------------------------- 

    $row_data1 = explode(' ', $row_data[3]); //chop index item based on smaller space 

    $rowd_data2[$row_data1]['urlsflows']   = $row_data1[3]; 


    //display data 
    // echo 'Row ' . $row . ' TIMESTAMP: ' . $info[$row]['timestamp'] . '<br />'; 
    // echo 'Row ' . $row . ' LOCALINFO: ' . $info[$row]['localinfo'] . '<br />'; 
    // echo 'Row ' . $row . ' IP: ' . $info[$row]['ip'] . '<br />'; 

    //--The line below is where I am lost. Kindly help. 

    echo $rowd_data2[$row_data1]['urlsflows']; 


     } //end of for loop 

?> 
+0

Не могли бы вы добавить свой текущий результат? – Sakuto

+0

Hi - В настоящее время ничего не отображается. Я думаю, что 2-му взрыву нужен еще один цикл? Благодарю. –

+0

Из ваших данных примера над вашим массивом '$ row_data' будет два элемента в нем, так как есть только один большой пробел. Итак, '$ row_data1 = explode ('', $ row_data [3]);' на самом деле должно быть '$ row_data1 = explode ('', $ row_data [1]);' –

ответ

0

Я думаю, что это должно работать:

$txt_file = file_get_contents('C:\sample.txt'); 
$rows  = explode("\n", $txt_file); 
array_shift($rows); 

$info = []; 
foreach($rows as $row => $data) 
{ 
    //get row data 
    $row_data = explode(' ', $data); //chop each row first based on bigger space 

    //-------------------------- 
    $info[$row] = []; 
    list($info[$row]['timestamp'], $info[$row]['ip'],$info[$row]['other']) = explode(" ", $row_data[0]); 

    // $info[$row]['localinfo']   = $row_data[1]; 

    //-------------------------- 

    $row_data1 = explode(' ', $row_data[1]); //chop index item based on smaller space 

    $rowd_data2[$row_data1]['urlsflows']   = $row_data1[3]; 


    //display data 
    // echo 'Row ' . $row . ' TIMESTAMP: ' . $info[$row]['timestamp'] . '<br />'; 
    // echo 'Row ' . $row . ' LOCALINFO: ' . $info[$row]['localinfo'] . '<br />'; 
    // echo 'Row ' . $row . ' IP: ' . $info[$row]['ip'] . '<br />'; 

    //--The line below is where I am lost. Kindly help. 

    echo $rowd_data2[$row_data1]['urlsflows']; 


     } //end of for loop 

?> 
0
<?php 
$myfile = fopen("C:\sample.txt", "r") or die("Unable to open file!"); 
// Output one line until end-of-file 
while(!feof($myfile)) { 
    echo $line = fgets($myfile) . "<br>";// you can do the explode and assignment here. 
    //example 
    $row_data = explode(' ', $line); 
    //don't worry about spaces, it will trim by PHP `trim` function, that will erase all the spaces 
} 
fclose($myfile); 
?> 
+0

Hi Frayne - Это выглядит интересно и просто. Как извлечь отдельные элементы строки, подобные мне, из этой строки $ row_data []? Любезно помочь. Благодарю. –

+0

Я думал, вам нужно «взорваться» только «пробелом». если у вас есть большое 'whitespace', тогда начните с него. Либо ваши важные потери. –

+0

@SKro, но таким образом вы также можете делать вещи и не нуждаться в дополнительном взрыве, как вы делаете для получения '$ rows' –

1

Этот код работает для входного файла:

<?php 
$rows = explode("\n", file_get_contents('SAMPLE.TXT')); 
$result = array(); 

foreach ($rows as $row) { 
    if (trim($row) == "") { 
     continue; 
    } 
    $timeMatches = array(); 
    $reTime = "/([0-9-]* [0-9:]*) /"; 
    preg_match($reTime, $row, $timeMatches); 
    $re = "/src=(.*) dst=(.*) mac=(.*) user=(.*) agent=(.*) request: (.*) (.*)/"; 
    $matches = array(); 
    preg_match($re, $row, $matches); 
    $result[] = array('time' => $timeMatches[1], 'src' => $matches[1] 
       , 'dst' => $matches[2], 'mac' => $matches[3] 
       , 'user' => $matches[4], 'agent' => $matches[5] 
       , 'method' => $matches[6], 'url' => $matches[7]); 
} 

var_dump($result); 

Выход var_dump ($ result) составляет:

array(2) { 
[0]=> 
    array(8) { 
    ["time"]=> 
    string(20) "2016-02-24 13:54:23" 
    ["src"]=> 
    string(18) "172.16.41.15:62490" 
    ["dst"]=> 
    string(16) "144.76.76.148:80" 
    ["mac"]=> 
    string(17) "00:1B:0D:63:84:00" 
    ["user"]=> 
    string(49) "CN=Smith\John,OU=S-HS,OU=SAcc,DC=abc,DC=org,DC=ab" 
    ["agent"]=> 
    string(76) "'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 seb/2.0 SEBKEY'" 
    ["method"]=> 
    string(3) "GET" 
    ["url"]=> 
    string(63) "http://something.com/theme/image.php/clean/page/1455532301/icon" 
    } 
    [1]=> 
    array(8) { 
    ["time"]=> 
    string(20) "2016-02-24 13:54:23" 
    ["src"]=> 
    string(18) "172.16.41.15:62485" 
    ["dst"]=> 
    string(16) "144.76.76.148:80" 
    ["mac"]=> 
    string(17) "00:1B:0D:63:84:00" 
    ["user"]=> 
    string(49) "CN=Smith\John,OU=S-HS,OU=SAcc,DC=abc,DC=org,DC=ab" 
    ["agent"]=> 
    string(76) "'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 seb/2.0 SEBKEY'" 
    ["method"]=> 
    string(3) "GET" 
    ["url"]=> 
    string(71) "http://somethingelse.com/theme/image.php/clean/core/1455532301/f/pdf-24" 
    } 
} 
+0

Это выглядит многообещающим Корди! Поиграть с ним. Спасибо. –

+0

Один вопрос Kordi - Как получить доступ к отдельным элементам в $ result []? Как внутри - как хранятся данные в нем? Благодарю. –

+0

Сбросил выход, поэтому его ясность. Если вы хотите получить доступ к методу первой строки, просто используйте $ result [0] ['method'] – Kordi

Смежные вопросы