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

如何用PHP/JS读取用户上传txt指定内容且无需存入数据库

功能实现方案

两种方案都满足「不写死文件路径、无需存储用户上传文件到数据库/持久化存储、提取关键词匹配结果到textarea」的要求,优先选纯JS方案,实时性最好,无页面刷新。

方案1:纯Javascript实现(推荐)

完全在用户本地浏览器运行,文件不需要上传到服务器,选中txt文件后立刻完成关键词匹配,无等待。
完整可直接运行代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>txt关键词提取</title>
</head>
<body>
    <div>
        <!-- 可自定义要搜索的关键词 -->
        <label>搜索关键词:<input type="text" id="keyword" value="model number"></label>
        <br><br>
        <input type="file" id="fileInput" accept=".txt">
        <br><br>
        <textarea id="resultArea" cols="80" rows="20" placeholder="匹配结果将展示在这里"></textarea>
    </div>

    <script>
        const fileInput = document.querySelector('#fileInput');
        const resultArea = document.querySelector('#resultArea');
        const keywordInput = document.querySelector('#keyword');

        // 统一绑定提取逻辑:文件选择/关键词修改时实时更新结果
        function extractMatchResult() {
            const files = fileInput.files;
            const keyword = keywordInput.value.trim();
            if(files.length === 0 || !keyword) {
                resultArea.value = '';
                return;
            }

            const file = files[0];
            // 只处理txt文件
            if(file.type !== 'text/plain') {
                alert('请上传txt格式文件');
                return;
            }

            const reader = new FileReader();
            reader.onload = (e) => {
                const fileContent = e.target.result;
                // 按换行拆分所有行,兼容windows/mac换行符
                const lines = fileContent.split(/\r\n|\n/);
                // 匹配关键词,不区分大小写
                const matchReg = new RegExp(keyword, 'i');
                const matchedLines = lines.filter(line => matchReg.test(line));
                // 把匹配结果写入textarea
                resultArea.value = matchedLines.join('\n');
            };
            reader.onerror = (e) => alert('文件读取失败:' + e.target.error.name);
            reader.readAsText(file);
        }

        fileInput.addEventListener('change', extractMatchResult);
        keywordInput.addEventListener('input', extractMatchResult);
    </script>
</body>
</html>

代码逻辑说明:

  • 支持自定义修改搜索关键词,关键词修改/文件切换时实时更新匹配结果
  • 自动兼容不同系统的换行符,匹配默认不区分大小写
  • 全程文件只在用户本地浏览器处理,不会上传到任何服务器

方案2:PHP实现

利用PHP上传文件的临时文件机制处理:用户上传的文件会被PHP自动存在系统临时目录,脚本执行结束后会自动删除,不需要手动持久化存储或者写入数据库,也不需要写死文件路径,通过$_FILES超全局变量获取上传文件的临时路径即可。
完整可直接运行代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>txt关键词提取</title>
</head>
<body>
    <form enctype="multipart/form-data" method="post" action="">
        <div>
            <input type="file" name="upload_file" accept=".txt">
            <button type="submit">提取匹配结果</button>
            <br><br>
            <textarea cols="80" rows="20" placeholder="匹配结果将展示在这里">
<?php
// 仅在有文件上传时执行处理逻辑
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
    $uploadFile = $_FILES['upload_file'];
    // 校验上传是否出错
    if ($uploadFile['error'] !== UPLOAD_ERR_OK) {
        echo "文件上传出错,错误码:" . $uploadFile['error'];
        exit;
    }
    // 校验是否为合法上传的临时文件
    $tmpPath = $uploadFile['tmp_name'];
    if (!is_uploaded_file($tmpPath)) {
        echo "非法文件上传";
        exit;
    }
    // 读取临时文件的所有行,不需要写死固定路径
    $lines = file($tmpPath, FILE_IGNORE_NEW_LINES);
    // 要搜索的关键词,可自行修改
    $keyword = "model number";
    // 用preg_grep匹配含关键词的行,不区分大小写
    $matchedLines = preg_grep("/{$keyword}/i", $lines);
    // 输出匹配结果到textarea
    echo implode("\n", $matchedLines);
    // 临时文件PHP会在脚本执行完自动删除,无需手动清理
}
?>
            </textarea>
        </div>
    </form>
</body>
</html>

代码逻辑说明:

  • 没有写死任何固定文件路径,动态读取用户上传文件的临时路径
  • 不需要把文件存到数据库或者服务器持久化目录,临时文件自动回收
  • 符合要求用preg_grep完成关键词匹配

内容的提问来源于stack exchange,提问作者Ahmad Adamu Jajere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:15:34