PHP文件搜索

PHP文件搜索,php,file,search,Php,File,Search,我需要用php进行文件搜索,用glob进行文件名搜索,但我仍然需要搜索文件内部 我有一个原型,在,但我需要关键字和建议。此外,它还需要查看文件内部以查找匹配项 有人对如何做这类事情有想法吗 一个非常基本的方法是将每个文件读入PHP,并使用其中一个字符串搜索函数进行搜索 if (preg_match('/pattern/', file_get_contents($file))) { echo "found pattern in $file\n"; } //loop through all

我需要用php进行文件搜索,用glob进行文件名搜索,但我仍然需要搜索文件内部

我有一个原型,在,但我需要关键字和建议。此外,它还需要查看文件内部以查找匹配项


有人对如何做这类事情有想法吗

一个非常基本的方法是将每个文件读入PHP,并使用其中一个字符串搜索函数进行搜索

if (preg_match('/pattern/', file_get_contents($file))) {
   echo "found pattern in $file\n";
}
//loop through all filenames and for each one:
$contents = file_get_contents($filename) ;
if (strpos($contents, $keyword) !== false) {
    //found a match!
}
但是,这是非常低效的,因为每次执行搜索时都必须进行文件读取和搜索

这就是为什么搜索引擎会为他们事先知道的整个文件创建索引,然后只为搜索关键字查看这些索引。如果您想了解这一点,您需要一个单独的脚本(比如indexer.php),它将执行以下操作:

$words = array(
    'mobile' => array('filename1.txt', 'filename2.txt'),
    'answer' => array('filename3.txt', 'filename5.txt', 'filename6.txt'),
    //...

);
<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
if (preg_match('/pattern/', $buffer)) {
   echo "found pattern in $buffer\n";
}
    }
    fclose($handle);
}
?>
  • 循环遍历每个文件,获取其内容
  • 把这些话说出来
  • 保留在该文件中找到的唯一单词的记录
  • 将该记录存储在数据库或磁盘上的文件中
并让它不时运行以更新其索引。例如,其索引可以如下所示:

$words = array(
    'mobile' => array('filename1.txt', 'filename2.txt'),
    'answer' => array('filename3.txt', 'filename5.txt', 'filename6.txt'),
    //...

);
<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
if (preg_match('/pattern/', $buffer)) {
   echo "found pattern in $buffer\n";
}
    }
    fclose($handle);
}
?>
然后,当您搜索某个关键字时,您只需要从索引文件或数据库加载索引,然后查看该关键字所在的文件名

if (isset($words[$keyword])) {
    echo "Found in: " . join(', ', $words[$keyword]) ;
}

你有一个非常简单的方法来做这样的事情。接下来,您可以将索引存储到数据库中,计算每个文件中找到一个单词的次数以提供更相关的结果,等等。

在php中将整个文件读入一个变量? 说真的,来吧!php是一种超文本脚本语言! 您将遇到内存错误和其他不好的事情。。。 只有当您知道您的文件每个最大不超过百分之几KB时,才可以这样做

如果您想要性能,这里有一个针对oyu的解决方案:

<?php
$handle = popen('grep regex /path/to/file.txt', 'r');
$output = fread($handle, 2096);
pclose($handle);
?>

使用外部grep实用程序。 您可以使用一些开关来报告位置(偏移量),以查看找到匹配的位置 其工作原理如下(这次使用exec而不是popen进行演示):


很好的解释!——如果它对您可用,您可以使用cron作业来更新索引,例如每日更新。--Cron jobs以预设的时间或间隔()在服务器上执行一个文件。这是我最初想要做的,但搜索必须是实时的。@带有索引和建议的tann实时搜索可能超出了您尝试执行的范围。只需每隔几分钟运行一次索引器,或者以您期望的文件更改频率运行一次索引器,使其始终具有新的索引数据。要获得最高效的解决方案,您需要将作业移交给专门为此目的设计的工具。见: