0

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.

2
  • What do you mean by 'filtering by keywords' ? You want to see if a line of the log includes a certain word in it? Commented Jan 12, 2012 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. Commented Jan 12, 2012 at 20:43

2 Answers 2

2

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;
    }
  }
}
Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.