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

PHP 實現搜索引擎來路關鍵詞提取與展示

     編輯:PHP 相關知識

當訪客通過搜索引擎進入網站時,獲取其搜索關鍵詞並動態展示相關內容,能顯著提升用戶留存與轉化。本文實現一個完整的關鍵詞提取插件,支持主流搜索引擎,兼容多種編碼格式。

核心功能架構

  • 來源識別:解析 HTTP Referer,匹配已知搜索引擎域名
  • 參數提取:根據引擎特徵提取查詢參數(如 Google 的 q、百度的 wd)
  • 編碼轉換:處理 URL 編碼、Unicode 轉義、GBK/UTF-8 自動識別轉換
  • 前端展示:動態生成「相關搜索」推薦區塊

關鍵代碼實現

1. 搜索引擎特徵庫

function ls_get_delim($ref) {
    $search_engines = array(
        'google.com.hk' => 'q', 'google.com.tw' => 'q', 'go.google.com' => 'q',
        'google.com' => 'q', 'blogsearch.google.com' => 'q', 'cn.bing.com' => 'q',
        'one.cn.yahoo.com' => 'p', 'baidu.com' => 'wd', 'soso.com' => 'w',
        'youdao.com' => 'q', 'sogou.com' => 'query'
    );
    return isset($search_engines[$ref]) ? $search_engines[$ref] : false;
}

2. 通用 URL 解碼函數

function unescape($str) {
    $ret = '';
    $len = strlen($str);
    for ($i = 0; $i < $len; $i++) {
        if ($str[$i] == '%' && $str[$i + 1] == 'u') {
            // Unicode 轉義處理 \uXXXX
            $val = hexdec(substr($str, $i + 2, 4));
            if ($val < 0x7f) $ret .= chr($val);
            elseif ($val < 0x800) $ret .= chr(0xc0 | ($val >> 6)) . chr(0x80 | ($val & 0x3f));
            else $ret .= chr(0xe0 | ($val >> 12)) . chr(0x80 | (($val >> 6) & 0x3f)) . chr(0x80 | ($val & 0x3f));
            $i += 5;
        } elseif ($str[$i] == '%') {
            // 標準 URL 編碼 %XX
            $ret .= urldecode(substr($str, $i, 3));
            $i += 2;
        } else {
            $ret .= $str[$i];
        }
    }
    return $ret;
}

3. 關鍵詞提取主流程

function ls_get_terms($d) {
    $queryString = unescape($_GET['referer']);
    $query_str = parse_url($queryString);
    parse_str($query_str['query'], $query_str);
    $query = urldecode($query_str[$d]);
    
    // 清理特殊字符
    $query = str_replace(array("'", '"'), '', $query);
    $query_array = preg_split('/[\s,+.]+/', $query);
    $query_terms = implode(' ', $query_array);
    $terms = htmlspecialchars($query_terms);
    
    // 編碼自動檢測轉換
    if (!yxiao_seems_utf8($terms)) {
        $terms = iconv("GBK", "UTF-8//IGNORE", $terms);
    }
    return $terms;
}

4. UTF-8 編碼檢測

function yxiao_seems_utf8($str) {
    $length = strlen($str);
    for ($i = 0; $i < $length; $i++) {
        $c = ord($str[$i]);
        if ($c < 0x80) $n = 0;
        elseif (($c & 0xE0) == 0xC0) $n = 1;
        elseif (($c & 0xF0) == 0xE0) $n = 2;
        elseif (($c & 0xF8) == 0xF0) $n = 3;
        elseif (($c & 0xFC) == 0xF8) $n = 4;
        elseif (($c & 0xFE) == 0xFC) $n = 5;
        else return false;
        for ($j = 0; $j < $n; $j++) {
            if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80)) return false;
        }
    }
    return true;
}

5. 前端動態渲染

<?php if (ls_getinfo('isref')) { ?>
document.write('<div id="serp"><p>');
document.write('更多搜索結果:<em><a href="https://www.jb51.net/search?q=<?php ls_getinfo('terms'); ?>" ');
document.write('title="查看<?php ls_getinfo('terms'); ?>的搜索結果" rel="nofollow"><?php ls_getinfo('terms'); ?></a></em>');
document.write('</p></div>');
<?php } ?>

現代化改進建議

1. 使用 JSONP / AJAX 替代 document.write

<div id="search-suggestions"></div>
<script>
fetch('/api/get-keywords?referer=' + encodeURIComponent(document.referrer))
  .then(res => res.json())
  .then(data => {
    if (data.keywords) {
      document.getElementById('search-suggestions').innerHTML = 
        `更多搜索:<a href="/search?q=${encodeURIComponent(data.keywords)}">${data.keywords}</a>`;
    }
  });
</script>

2. 關鍵詞數據持久化分析

將提取的關鍵詞存入數據庫,構建站內熱門搜索榜、內容缺口分析報表:

CREATE TABLE search_keywords (
    id INT AUTO_INCREMENT PRIMARY KEY,
    keyword VARCHAR(255) NOT NULL,
    source_engine VARCHAR(50),
    landing_page VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_keyword (keyword),
    INDEX idx_created (created_at)
);

3. 隱私合規處理

  • 遵循 GDPR/個信法,關鍵詞脫敏存儲
  • 提供用戶退出追蹤機制
  • Referer 策略設置:<meta name="referrer" content="strict-origin-when-cross-origin">

常見問題排查

現象原因解決方案
關鍵詞顯示亂碼編碼檢測失敗強制指定 iconv 源編碼,或引入 mb_detect_encoding
無法獲取 RefererHTTPS→HTTP 降級/Referer Policy檢查 Referrer-Policy 頭,確保同域或跨域允許
新搜索引擎不支持特徵庫未更新定期維護 $search_engines 數組,添加 duckduckgo.com => 'q' 等

總結

搜索來路關鍵詞提取是連接「用戶意圖」與「站內內容」的關鍵橋樑。本文提供的解決方案涵蓋從底層編碼處理到前端展示的完整鏈路,並給出現代化重構方向。實際部署時建議結合緩存策略(如 Redis 存儲引擎特徵庫),減少正則匹配開銷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved