You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP实现目录递归搜索多类型文件内容并生成匹配链接?

需求场景与现有实现

我在群晖NAS上搭建了公司内网页面,页面包含多个指向内部文档(操作指南、流程文件等)的链接。目前使用以下PHP脚本按部门展示指定目录下的文件链接:

<?php
    $dir = "./files_to_serve/Fabrication/How_To"; //Directory to be iterated for links
    if (is_dir($dir)){//make sure its a directory
        if ($dh = opendir($dir)){// Open a directory, read its contents
            while (($file = readdir($dh)) !== false){
               if ($file != "." and $file != "..") { // skip links "." and ".."
                   $encoded_file = rawurlencode($file);// replace spaces in filenames with %20, etc
                   echo "<a href=$dir/$encoded_file target=\"_blank\">$file</a><br><br>"; //create download links to files
               }
            }  
            closedir($dh);
        }
    }
?> <!-- End PHP -->

现在需要新增搜索功能:通过HTML表单输入字符串,递归搜索./files_to_serve目录下的所有文件(包含.xlsx等多种类型),返回包含匹配内容的文件链接列表(最好按相关性排序)。原本计划用PHP实现,但发现grep无法处理.xlsx这类文件,同时担心重复造轮子,想请教是否有现成的实现方法,或是可行的多类型文件内容搜索方案。注:此需求为目录文件递归搜索,非SQL数据库搜索。


可行的实现方案

方案1:PHP结合第三方库解析多格式文件

针对不同文件类型,用专门的PHP库提取文本内容后再搜索,适配绝大多数办公文档格式:

  • Excel(.xlsx/.xls):用PhpSpreadsheet读取单元格文本
  • Word(.docx/.doc):用PhpOffice/PhpWord提取文档内容
  • PDF:用pdfparser库解析文本
  • 普通文本/Markdown/CSV:直接读取文件内容匹配

核心实现步骤:

  1. 编写递归遍历目录的函数,获取所有目标文件路径
  2. 根据文件后缀调用对应库提取文本
  3. 统计关键词匹配次数作为相关性得分
  4. 按得分排序后生成文件链接列表

示例核心代码:

function searchFiles($dir, $keyword) {
    $matches = [];
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    
    foreach ($iterator as $file) {
        if (!$file->isFile()) continue;
        
        $content = '';
        $ext = strtolower($file->getExtension());
        
        // 按文件类型提取内容
        switch($ext) {
            case 'xlsx':
                $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file->getPathname());
                foreach ($spreadsheet->getAllSheets() as $sheet) {
                    $content .= $sheet->getCellCollection()->getPlainText();
                }
                break;
            case 'docx':
                $phpWord = \PhpOffice\PhpWord\IOFactory::load($file->getPathname());
                foreach ($phpWord->getSections() as $section) {
                    foreach ($section->getElements() as $element) {
                        if (method_exists($element, 'getText')) {
                            $content .= $element->getText();
                        }
                    }
                }
                break;
            case 'txt': case 'md': case 'csv':
                $content = file_get_contents($file->getPathname());
                break;
            // 可扩展添加更多文件类型的解析逻辑
        }
        
        // 计算匹配次数作为相关性得分
        $matchCount = substr_count(strtolower($content), strtolower($keyword));
        if ($matchCount > 0) {
            $matches[] = [
                'path' => str_replace('./', '', $file->getPathname()),
                'name' => $file->getFilename(),
                'score' => $matchCount
            ];
        }
    }
    
    // 按相关性降序排序
    usort($matches, function($a, $b) {
        return $b['score'] - $a['score'];
    });
    
    return $matches;
}

方案2:借助群晖命令行工具辅助搜索

群晖支持SSH执行命令,可利用处理多格式文件的命令行工具转换文本后搜索:

  • pandoc:将docx、pdf等格式转成纯文本
  • xlsx2csv:将xlsx转成CSV格式提取文本
  • antiword:提取.doc文件文本

实现思路:

  1. 通过PHP的shell_exec()调用命令行脚本,递归搜索目标目录
  2. 解析命令输出获取匹配文件路径
  3. 生成链接列表返回前端

示例命令与PHP调用:

$keyword = $_POST['search_keyword'];
$safeKeyword = escapeshellarg($keyword);
// 构建搜索命令
$command = <<<CMD
find ./files_to_serve -type f \( -name "*.xlsx" -o -name "*.docx" -o -name "*.txt" -o -name "*.md" \) | while read file; do
    case "\${file##*.}" in
        xlsx) xlsx2csv "\$file" | grep -qi $safeKeyword && echo "\$file";;
        docx) pandoc -s "\$file" -t plain | grep -qi $safeKeyword && echo "\$file";;
        txt|md) grep -qi $safeKeyword "\$file" && echo "\$file";;
    esac
done
CMD;
$output = shell_exec($command);
$matches = array_filter(explode("\n", trim($output)));
// 后续处理生成文件链接

方案3:部署现成开源搜索工具

如果不想自行开发,可直接在群晖上部署开源文件搜索工具:

  • Searchlight:轻量级Web文件内容搜索工具,支持多格式文档
  • Elasticsearch + Filebeat:适合文件数量多的场景,定期扫描目录建立索引,搜索效率极高
  • Seafile:自带文档搜索功能,同时可作为文件存储服务使用

这类工具自带Web界面,可直接嵌入内网页面或通过iframe集成,省去开发成本。


内容的提问来源于stack exchange,提问作者hderic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:48:18