如何扫描目录中的特定文本行并用php列出所有匹配的文件?
感谢。
答案 0 :(得分:7)
我实际上几天前为此写了一个函数......
这是扫描每个文件的基本功能......
foreach (glob("<directory>/*.txt") as $search) {
$contents = file_get_contents($search);
if (!strpos($contents, "text")) continue;
$matches[] = $search;
}
不是最先进的方法,我的功能要长得多,但它也使用了我其他各种类的所有功能,这基本上就是它的功能。
答案 1 :(得分:1)
另一种方法是读取php文件,将内容放入数组并使用类似preg_grep的内容。
如果文件数量可能非常大,您可能希望将UNIX grep 命令与php exec 一起使用。
我个人会去寻找第二个解决方案。
答案 2 :(得分:1)
这是一个简单的例子,说明如何在php中严格完成...
获取目录中所有文件/目录的列表。
检查每个文件/目录名称是否为文件
获取文件的内容
使用字符串搜索功能查找我们正在寻找的字符串的匹配项。如果存在匹配项,请打印文件名
MEEP
<?php
$path = 'c:\\some\\cool\\directory';
$findThisString = 'Cool Cheese';
$dir = dir($path);
// Get next file/dir name in directory
while (false !== ($file = $dir->read()))
{
if ($file != '.' && $file != '..')
{
// Is this entry a file or directory?
if (is_file($path . '/' . $file))
{
// Its a file, yay! Lets get the file's contents
$data = file_get_contents($path . '/' . $file);
// Is the str in the data (case-insensitive search)
if (stripos($data, $findThisString) !== false)
{
// sw00t! we have a match
echo 'match found in ' . $file . "<br>\n";
}
}
}
}
$dir->close();
?>
答案 3 :(得分:1)
如果文件很大,则必须将每个文件读入内存然后搜索其内容,这是过分的。
如果您对目录具有读取权限,则可以通过将exec与egrep组合来找出针所在的文件:
php > exec("egrep -rl 'string of what I want to find' full-or-relative-directory", $output);
php > print_r($output);
Array
(
[0] => full-or-relative-directory/foo/bar.xml
)
php > $contents = file_get_contents($output[0]);
答案 4 :(得分:0)
好吧,首先你可能希望获得glob感兴趣的文件列表(如果你想要多个扩展,只需合并生成的数组或使用this)。然后遍历结果,使用file_get_contents打开文件,并使用strpos检查字符串。
答案 5 :(得分:0)
我不会在这里提出我的建议答案,因为有5个人已经就如何解决这个问题发表了很好的答案,但会推荐一个替代方案。
您是否考虑过使用Lucene搜索引擎的PHP实现?最值得注意的是来自Zend Framework。最好的是你不必使用框架来使用Lucene库(只需包含库基本文件 - 记住将Zend Libraries目录添加到include路径中)。
我自己没有使用它,并且听过非常复杂的评论。我唯一能想到的是它对于一个小脚本或项目来说可能太复杂了。
Zend框架参考指南中有一篇非常详细的overview of the Lucene Library。
答案 6 :(得分:-1)
$directory = "/var/www/application/store/"; //define the path
$files1 = scandir($directory); //scandir will scan the directory
$c = count($files1); //this will count all the files in the directory
print $c;