up vote 0 down vote favorite
share [fb]

What could I add to the following code to filter the returned results using keywords in an array?

The code that send the keywords, and made the funciton call is in Javasript.

The code below opens a file, takes a pointer using a request, opens the file finds the pointer, and retrieves all log lines from the pointer to the end of the file. Then it formats it into a JSON object and sends back to Javacript.

function tail(){
    $keywords = json_decode($_REQUEST['keywords']);

    $file = "/path/to/the/log.log";
    $handle = fopen($file, "r");
    clearstatcache();       

    if ($_REQUEST['pointer'] == '') {
        fseek($handle, -1024, SEEK_END);
    } else {
        fseek($handle, $_REQUEST['pointer']);
    }

    while ($buffer = fgets($handle)) { 
        $log .= $buffer . "<br />\n";
    } 



    $output = array("pointer" => ftell($handle), "log" => $log);
    fclose($handle);

    echo json_encode($output);
}

Please tell me how I can filter the retrieved data using the keywords in the keywords array.

link|improve this question

0% accept rate
What do you mean by 'filtering by keywords' ? You want to see if a line of the log includes a certain word in it? – Brian Glaz Jan 12 at 20:41
Yes... If the received line contains any of the keywords then I want to keep that line and discard any other lines that do not contain any of the keywords. – amlane86 Jan 12 at 20:43
feedback

2 Answers

You could split the line on every space and check each word against the supplied keywords:

while ($buffer = fgets($handle)) { 
    $words = explode(' ', $buffer);
    foreach($words as $word) {
       if(in_array($word, $keywords)) {
          $log .= $buffer . "<br />\n";
          break;
       }
    }
} 

or check each keyword against the read line:

 while ($buffer = fgets($handle)) { 
    foreach($keywords as $keyword) {
       if(strstr($buffer, $keyword)) {
          $log .= $buffer . "<br />\n";
          break;
       }
    }
}  
link|improve this answer
feedback

Change your read loop to this:

while ($buffer = fgets($handle)) { 
    foreach ($keywords as $kw) { // Loop keywords
        if (strpos($buffer, $kw) !== FALSE) { // Search for this keyword
            // If we get here, we found a keyword
            $log .= $buffer . "<br />\n";
            break;
        }
    }
} 

If you want to match in a case-insensitive manner, you could use stripos() instead.

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.