首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實作靜態網站全文搜尋引擎完整教學

     編輯:PHP 綜合知識

應用場景

純靜態 HTML 網站(Dreamweaver/FrontPage 產出),無資料庫,需提供關鍵字搜尋功能。透過 PHP 遞迴掃描檔案、解析內容、建立索引陣列即可實作簡易搜尋引擎。

核心流程

  1. 表單送出關鍵字(POST)
  2. 遞迴遍歷目錄(opendir/readdir)
  3. 讀取檔案內容(file_get_contents)
  4. 提取 <body> 區塊並移除 HTML 標籤(strip_tags)
  5. 正則比對關鍵字(preg_match,大小寫不敏感)
  6. 提取 <title> 作為標題
  7. 結果存入陣列,輸出連結清單

完整程式碼(search.php)

<?php
set_time_limit(600); // 防止大量檔案逾時

$keyword = trim($_POST['keyword'] ?? '');
if ($keyword === '') {
    exit('請輸入搜尋關鍵字');
}

// 安全:僅允許字母數字中文,防正則注入
$keyword = preg_quote($keyword, '/');

$results = [];
searchFiles('.', $keyword, $results);

function searchFiles($dir, $keyword, &$results) {
    $handle = opendir($dir);
    while (false !== ($file = readdir($handle))) {
        if ($file === '.' || $file === '..') continue;
        $path = "$dir/$file";
        if (is_dir($path)) {
            searchFiles($path, $keyword, $results);
        } elseif (is_file($path) && $file !== 'search.php') {
            $content = @file_get_contents($path);
            if ($content === false) continue;

            // 提取 body 內容
            if (preg_match('/<body[^>]*>(.+)<\/body>/is', $content, $m)) {
                $body = strip_tags($m[1]);
            } else {
                $body = strip_tags($content);
            }

            if (preg_match("/$keyword/i", $body)) {
                // 提取 title
                $title = '無標題';
                if (preg_match('/<title>(.+)<\/title>/i', $content, $tm)) {
                    $title = trim($tm[1]);
                }
                $results[] = ['path' => $path, 'title' => $title];
            }
        }
    }
    closedir($handle);
}

// 輸出結果
foreach ($results as $r) {
    echo "<a href='{$r['path']}' target='_blank'>{$r['title']}</a><br>\n";
}
if (empty($results)) echo '找不到相關結果';
?>

進階優化方向

  • 建立倒排索引:離線掃描建立 SQLite/FTS5 或 MeiliSearch 索引,查詢毫秒級
  • 中文分詞:整合 Jieba-PHP、SCWS 解決中文斷詞問題
  • 分頁與高亮:限制結果筆數、關鍵字高亮顯示
  • 快取機制:檔案修改時間未變則重用上次掃描結果
  • 並行掃描:pcntl_fork 或多程序分割目錄加速

安全性提醒

  • 限制掃描目錄範圍,避免洩露敏感檔案
  • 關鍵字經 preg_quote 轉義防正則注入
  • 設定 open_basedir 限制 PHP 存取路徑
  • 大型網站建議改用專用搜尋引擎
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved