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

如何在PHP中用preg_match结合数组检测搜索词所属固定类别?

完善PHP文本搜索与类别匹配功能的完整实现

看起来你已经搭好了核心框架,咱们把逻辑补全,实现搜索关键词、匹配对应类别、并用HTML表格展示结果的完整功能。我会基于你的现有代码修改,同时优化细节适配阿拉伯语场景:

完整代码实现

<?php
// 定义固定的10个类别(这里示例3个,你可以补充剩下的7个)
$categories = ["محلي", "إقليمي", "دولي"];
$result = [];

if(isset($_POST["search"])) {
    $searchTerm = trim($_POST['name']);
    // 处理空搜索的边界情况
    if(empty($searchTerm)) {
        echo "<p>请输入搜索关键词</p>";
        exit;
    }

    echo "<h3>搜索关键词:$searchTerm 的结果</h3><br>";

    // 遍历目标目录下的所有TXT文件
    foreach(glob($_SERVER['DOCUMENT_ROOT']."/readfiletest/*.txt") as $txtFile) {
        $fileName = basename($txtFile); // 提取纯文件名(不带路径)
        $lineNumber = 1;
        $fileHandle = fopen($txtFile, 'r');

        // 处理文件无法打开的异常
        if(!$fileHandle) {
            echo "<p>无法读取文件:$fileName</p>";
            continue;
        }

        // 逐行读取文件内容
        while(($lineContent = fgets($fileHandle)) !== false) {
            $lineContent = trim($lineContent);
            // 跳过空行,减少无效处理
            if(empty($lineContent)) {
                $lineNumber++;
                continue;
            }

            // 检测当前行是否包含搜索关键词(支持阿拉伯语等Unicode字符,不区分大小写)
            $searchPattern = '/'.preg_quote($searchTerm, '/').'/iu';
            if(preg_match($searchPattern, $lineContent)) {
                // 匹配当前行对应的类别
                $matchedCategory = "未分类"; // 默认兜底值
                foreach($categories as $category) {
                    $catPattern = '/'.preg_quote($category, '/').'/u';
                    if(preg_match($catPattern, $lineContent)) {
                        $matchedCategory = $category;
                        break; // 找到第一个匹配的类别就停止,若一行可属多类可移除break
                    }
                }

                // 高亮显示搜索关键词
                $highlightedContent = preg_replace($searchPattern, '<mark>$0</mark>', $lineContent);

                // 将结果存入数组,统一管理方便后续渲染表格
                $result[] = [
                    'file' => $fileName,
                    'line' => $lineNumber,
                    'category' => $matchedCategory,
                    'content' => $highlightedContent
                ];
            }
            $lineNumber++;
        }
        fclose($fileHandle);
    }

    // 生成HTML表格展示结果
    if(!empty($result)) {
        echo "<table border='1' cellpadding='8' cellspacing='0' style='direction: rtl;'>";
        echo "<tr><th>文件名</th><th>行号</th><th>类别</th><th>匹配内容</th></tr>";
        foreach($result as $item) {
            echo "<tr>";
            echo "<td>{$item['file']}</td>";
            echo "<td>{$item['line']}</td>";
            echo "<td>{$item['category']}</td>";
            echo "<td>{$item['content']}</td>";
            echo "</tr>";
        }
        echo "</table>";
    } else {
        echo "<p>未找到包含关键词「$searchTerm」的内容</p>";
    }
}
?>

<!-- 搜索表单(适配阿拉伯语从右到左排版) -->
<form method="post" style="direction: rtl;">
    <input type="text" name="name" placeholder="输入搜索关键词" required>
    <button type="submit" name="search">搜索</button>
</form>

关键逻辑说明

  1. 类别匹配优化:遍历预设类别数组,逐行检测匹配,找到第一个符合的类别后停止(若一行可归属多个类别,可移除break)。
  2. 结果统一管理:用数组$result收集所有匹配项,最后一次性生成表格,比边读边输出更整洁易维护。
  3. Unicode适配:正则添加/u修饰符,确保阿拉伯语等非ASCII字符能正确匹配;表格和表单添加direction: rtl适配从右到左排版。
  4. 用户体验优化:添加空搜索、无结果、文件读取失败的友好提示,并用<mark>标签高亮搜索关键词。
  5. 细节处理:用basename()提取纯文件名,跳过空行减少无效计算,确保资源正确关闭。

你只需要把$categories数组补充完整到10个类别,就可以直接使用啦。如果你的类别是和文件一一对应的(比如每个TXT文件对应一个固定类别),可以告诉我,我再帮你调整逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:33