如何在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>
关键逻辑说明
- 类别匹配优化:遍历预设类别数组,逐行检测匹配,找到第一个符合的类别后停止(若一行可归属多个类别,可移除
break)。 - 结果统一管理:用数组
$result收集所有匹配项,最后一次性生成表格,比边读边输出更整洁易维护。 - Unicode适配:正则添加
/u修饰符,确保阿拉伯语等非ASCII字符能正确匹配;表格和表单添加direction: rtl适配从右到左排版。 - 用户体验优化:添加空搜索、无结果、文件读取失败的友好提示,并用
<mark>标签高亮搜索关键词。 - 细节处理:用
basename()提取纯文件名,跳过空行减少无效计算,确保资源正确关闭。
你只需要把$categories数组补充完整到10个类别,就可以直接使用啦。如果你的类别是和文件一一对应的(比如每个TXT文件对应一个固定类别),可以告诉我,我再帮你调整逻辑~
内容的提问来源于stack exchange,提问作者Ghgh Lhlh
相关产品推荐
相关产品推荐

