1

有趣的问题:我在一堆文件和目录中搜索关键字,我的函数将文件名作为数组返回:

$files = array();

function search_in_dir($dir, $str) {
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $filename) {
        $files[] = $filename;
    }

    foreach ($files as $k => $file) {
        $source = file_get_contents($file);
        if (strpos($source, $str) === false) {
            unset($files[$k]);
        }
    }
    return array_filter($files);
}

$filenamesWithPaths = search_in_dir("/home/Documents", "testKeyword");

该变量$filenamesWithPaths现在包含一个文件名和路径数组。然而,我最终想要实现的是一个关联数组或一些集合,其中包含带有文件名的路径以及周围的文本(在我的例子中是 HTML 代码)。

可以想象返回找到关键字的整行,然后我用其他指令进一步修剪它。

4

2 回答 2

0

由于 Stackoverflow 社区强烈建议避免使用 php 来搜索功能,我将使用 find,它的性能优于 grep

$search = 'find ' . $directory . ' -type f -exec grep -r ' . $keyword . ' {} + '
shell_exec($search);

将路径+文件名和周围的上下文存储到 php 中的集合中将是下一步。然而,这在某种程度上不起作用:

$RESULT = shell_exec('find ' . $domain . ' -type f -exec grep -r ' . $keyword . ' {} + ');

$arr = explode('/index.html:', $RESULT);

现在如何检索路径和周围的上下文;就像如何最好地解析 grep 输出一样?

于 2012-08-21T15:01:11.217 回答
0

好的,file() - 将整个文件读入数组

您可以遍历 foreach 中的每个项目并找到您的匹配项。

如果索引为 23,则它位于第 24 行。就这么简单,并按照您的喜好构建您的输出数组。

于 2012-08-21T14:42:20.360 回答