PHPのglobとpreg_grepでHTMLファイル検索

php コンピュータ
php
Raspberry OSで全文検索のソリューションを導入したいと思いいくつか試してみました。残念ながらArm系のプロセッサが対応していなかったり、起動出来たソリューションでもRasberry Piの性能不足で実用的なパフォーマンスが担保できませんでした。
とりあえず静的なhtmlの文字が検索出来れば良いので、PHPのglob()でファイル検索をして拡張子がhtmlのファイルの中身をpreg_grep()で文字マッチングするスクリプトを作成してみたいと思います。
<?php

function my_search($file, $search_word)
{
    $contents = file_get_contents($file);
    $charset = mb_detect_encoding($contents, "sjis-win, JIS, eucjp-win, utf-8");
    if (mb_strtolower($charset) != "utf-8")
    {
        $contents = mb_convert_encoding($contents, "utf-8", $charset);
    }
    $lines = preg_split("/\r\n|\r|\n/", $contents);
    $lines_count = count($lines);
    $result = array();
    for($i = 0; $i < $lines_count; $i++)
    {
        if (preg_match("/".$search_word."/", $lines[$i]))
        {
            $result[] = array($i, $lines[$i]);
        }
    }
    return $result;
}

function get_filelist($dir) {
    $files = glob(rtrim($dir, '/') . '/*');
    $list = array();
    foreach ($files as $file) {
        if (is_file($file)) {
            $list[] = $file;
        }
        if (is_dir($file)) {
            $list = array_merge($list, get_filelist($file));
        }
    }
    return $list;
}

#$file = '/var/www/html/webarc/20220610/www3.kiwi-us.com/‾tomoyaz/higa0001.html';
#var_dump(my_search($file, "DOS"));

$search_result = array();
$search_dir = "/var/www/html/webarc/";
$url_base = "http://pi3/webarc/";
if (array_key_exists("search_word", $_POST))
{
    $files = get_filelist($search_dir);

    foreach($files as $file)
    {
        if (preg_match("/html$/", $file))
        {
            $matches = my_search($file, $_POST["search_word"]);
            foreach($matches as $match)
            {
                $search_result[] = array($file, $match[0], $match[1]);
            }
        }
    }
    #var_dump($search_result);
}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>簡易テキストサーチ</title>
</head>
<body>
    <form method="post">
        <input type="text" name="search_word">
        <button type="submit">検索</button>
    </form>
    <hr>
<?php
    foreach($search_result as $a)
    {
        $url = str_replace($search_dir, $url_base, $a[0]);
        $content = htmlentities($a[2], ENT_QUOTES, 'UTF-8');
        $html = "<div>"."<span><a href=\"".$url."\">".$url."</a></span>"."&nbsp;<span>".$a[1]."行目</span>&nbsp;"."<br><span>抜粋:".$content."</span>"."</div>\n";
        echo($html);
    }
?>
</body>
</html>


ファイル数に比例して検索速度が低下するので、WEBアプリケーションとしては問題ですが、プライベートなWEBサーバーで動かす分には誰の迷惑にもならないので良しとします。

コメント