この機能を自分のサイトに実装しました。基本的に、ユーザーがクエリできるHTMLフォームがあります。
<form method="post" action="[_LINK_HELP_SEARCH_]">
<div class="static-text">(_INTRO_)</div>
<input class="inline" name="q" id="search" type="text" value="[_QUERY_]" />
<input class="inline" type="submit" value="(_SEARCH_)" />
<div class="micro-text">(_EXAMPLE_)</div>
</form>
注:すべての[XXX]と(YYY)はテンプレートフィールドであるため、コードで置き換える必要があります。
フォームが送信されると、PHPファイルはクエリを単語に分割します。
$query = preg_replace('/\s{2,}/', ' ', $query);
$words = explode(' ', $query);
ターゲットフォルダ内のすべてのファイルを検索します(
$help_files = _get_all_files('help');
$help_files = array_slice($help_files, 0, MAX_RESULTS);
foreach($help_files as $file) {
'help'フォルダーのみを検索することに注意してください。これは、自分のニーズに合わせて調整する必要があります。_get_all_filesは、指定されたフォルダー上のすべてのPHPファイルを一覧表示するカスタム関数であることにも注意してください。
次に、テキストを読み込んで解析します。
$text_file = '';
$filename = $file['page'];
if (_file_exists($filename)) {
$text_file = _read_php_file($filename);
}
$text_file = strtolower($text_file);
$text_file = strip_tags($text_file);
$text_file = preg_replace('/\[_(.*?)_\]/', '...', $text_file);
$text_file = preg_replace(array('/\s{2,}/', '[\t\n]'), ' ', $text_file);
ここで、_read_php_fileはPHPコンテンツファイルを読み取ることに注意してください。つまり、ユーザーがこのファイルを呼び出した場合に取得するのとまったく同じです。これは、テンプレートを使用していて、HTMLファイルが直接ではないためです。静的HTMLを使用する場合は、readfile()などを使用できます。
次に、単語を検索します。
$score = 0;
foreach ($words as $word) {
if (strpos($text_file, $word) !== false) {
$score++;
}
}
最適化できることはわかっていますが、今のところそれは必要ありません。基本的に、このコードはテキスト内で見つかった各単語をカウントし、スコアを取得します。
次に、テキストの抜粋を作成することに興味があるかもしれません。
$pos = strpos($text_file, $words[0]);
$cut_ini = max($pos - RESUME_LIMIT/2, 0);
$extract = substr($text_file, $cut_ini, RESUME_LIMIT);
$extract = "...$extract...";
最後に、スコアが重要な場合は、このすべての情報を(見つかったファイルごとに)出力配列に格納します。
if (($score > 0) && (count($words) / $score > 0.7)) {
$result = array (
'extract' => $extract,
'title' => $file['title'],
'link' => $file['page'],
'score' => $score
);
$results[] = $result;
}
もちろん、インデックスを作成するファイルごとにこれをすべて繰り返す必要があり、最後に配列を並べ替える必要があります。
usort($results, "_search_sort");
この機能で:
function _search_sort($a, $b) {
if ($a['score'] == $b['score']) {
return 0;
}
return ($a['score'] > $b['score']) ? -1 : 1;
}
最後に、検索結果を含むソートされた配列が表示されます。これがお役に立てば幸いです。