2010-09-23 137 views
2

我需要做一个文件搜索与PHP,我有文件名搜索下来,与glob,但我仍然需要搜索内部文件。PHP文件搜索

我有一个原型,在tann98.vacau.com/file-search,但我需要关键字和建议。加上它需要查看内部文件来查找匹配。

有没有人有关于如何做这种事情的想法?

+0

对于最高性能的解决方案,您需要将作业交给专为此目的而设计的工具。请参阅:http://stackoverflow.com/a/40773407/65732 – sepehr 2016-11-25 09:10:39

回答

2

一个非常基本的方法是将每个文件读入PHP并用字符串搜索函数之一搜索它们。

//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'), 
    //... 

); 

然后,当你正在寻找一个特定的关键字,你只需要从你的索引文件或数据库加载索引,看看哪些文件名,并字中找到。

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

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

+0

很好的解释! ---如果它对您可用,您可以使用cron作业来更新索引,例如每天更新。 --- Cron作业在预先设定的时间或间隔在服务器上执行一个文件(http://www.tophostingdeals.com/glossary.php)。 – matsolof 2010-09-25 12:08:24

+0

这是我最初想做的事情,但搜索需要实时。 – 2010-11-25 01:01:41

+0

@tann实时搜索索引和建议可能超出了你想要做的范围。每隔几分钟运行一次索引器,或者频繁地期望对文件进行更改,以便它始终具有新索引的数据。 – Fanis 2010-11-25 20:46:53

0
if (preg_match('/pattern/', file_get_contents($file))) { 
    echo "found pattern in $file\n"; 
} 
0

将整个文件读入到php中的变量中? 认真,加油! php是一种超文本脚本语言! 你会遇到内存不足的错误的和丑陋的其他的东西...... 只有做到这一点,如果你知道你的文件不超过各部分hundret千字节的最大...

如果你想表现,这里是一个解决方案oyu:

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

利用外部grep工具。 你可以给一些开关(使用EXEC代替POPEN示范目的这段时间)报告,其中发现匹配 这个工作原理是这样的位置(偏移量)看:

<?php 
exec('grep "REGEX" /path/to/file.txt -b', $result); 
?> 

这将可能唯一的工作在Linux中...

如果你真的想在php中做到这一点,或者这不适合你,不要使用file_get_contents或类似的东西,但通过文件寻找。莫比这样的:

<?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); 
} 
?> 

不是缓冲可能在4095个字节被切断...... 与fgets逐行地读取,但最多可以指定。