當訪客通過搜索引擎進入網站時,獲取其搜索關鍵詞並動態展示相關內容,能顯著提升用戶留存與轉化。本文實現一個完整的關鍵詞提取插件,支持主流搜索引擎,兼容多種編碼格式。
q、百度的 wd)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;
}
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;
}
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;
}
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;
}
<?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 } ?>
<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>
將提取的關鍵詞存入數據庫,構建站內熱門搜索榜、內容缺口分析報表:
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)
);
<meta name="referrer" content="strict-origin-when-cross-origin">| 現象 | 原因 | 解決方案 |
|---|---|---|
| 關鍵詞顯示亂碼 | 編碼檢測失敗 | 強制指定 iconv 源編碼,或引入 mb_detect_encoding |
| 無法獲取 Referer | HTTPS→HTTP 降級/Referer Policy | 檢查 Referrer-Policy 頭,確保同域或跨域允許 |
| 新搜索引擎不支持 | 特徵庫未更新 | 定期維護 $search_engines 數組,添加 duckduckgo.com => 'q' 等 |
搜索來路關鍵詞提取是連接「用戶意圖」與「站內內容」的關鍵橋樑。本文提供的解決方案涵蓋從底層編碼處理到前端展示的完整鏈路,並給出現代化重構方向。實際部署時建議結合緩存策略(如 Redis 存儲引擎特徵庫),減少正則匹配開銷。