<?
class StringSearcher
{
/**
* Seek position
*
* @var int
*/
var $seek = 0;
/**
* File pointer
*
* @var resource
*/
var $pointer = null;
/**
* Search string
*
* @var string
*/
var $search = "";
/**
* Buffer
*
* @var string
*/
var $buffer = "";
/**
* Found seek
*
* @var int
*/
var $found = -1;
/**
* Matchcase
* @var bool
*/
var $matchcase = true;
/**
* Read next buffer
*
* @return string
*/
function read()
{
$buffer = "";
if ($this->pointer && !feof($this->pointer))
{
fseek($this->pointer,$this->seek);
$readlength = 20480; //20 kb
//enough to contain search
if (($readlength + strlen($this->buffer)) < strlen($this->search))
{
$readlength = strlen($this->search) - strlen($this->buffer) + $readlength;
}
$buffer = fread($this->pointer,$readlength);
}
return $buffer;
}
/**
* Search for next string
*
* @return bool
*/
function search()
{
if (!$this->pointer) //where do you want me to find ?
{
return false;
}
if ($this->search == "") //what do you want me to find ?
{
return false;
}
$buffer =& $this->buffer; //back reference
$seek =& $this->seek;
if (strlen($buffer) <= strlen($this->search)) //update buffer
{
$buffer = $this->read();
if (strlen($buffer) < strlen($this->search)) //no more to find :(
{
return false;
}
if (!$this->matchcase)
{
$buffer = strtolower($buffer);
$this->search = strtolower($this->search);
}
}
//search in buffer
$pos = strpos($buffer,$this->search);
if ($pos !== false) //got it :)
{
$seek += $pos + 1;
$buffer = substr($buffer,$pos + 1);
$this->found = $seek-1;
}
else //nope :(
{
if (strlen($this->search) > 1)
{
$seek += strlen($buffer) - strlen($this->search) + 1;
$buffer = substr($buffer,-strlen($this->search) + 1);
}
else
{
$seek += strlen($buffer);
$buffer = "";
}
$this->found = -1;
}
return true;
}
/**
* Open file for searching
*
* @return bool
*/
function open($filename)
{
$this->close();
//open file and reset seek
$this->pointer = @fopen($filename,"rb");
$this->seek = 0;
$this->found = -1;
return ($this->pointer != null);
}
/**
* Close file and stop searching
*
*/
function close()
{
if ($this->pointer) @fclose($this->pointer);
$this->pointer = null;
}
}
?>
|