htmlファイルを一行ずつ読み込み必要な部分だけを抜き出すphpコード

htmlファイル、特にそれだけで数百kbにも昇る膨大な量の物を読み込むとき、正規表現を利用するとかなりの負荷がかかる。

ochalog
【PHP】どどんとふチャットログ HTML ファイルからチャットログ部分を抽出する

htmlなど最初と最後の文章構成が決まっている場合、「fgets」を利用し一行ずつ読み込みそれを判定していくとかなり高速に処理できる。

一行ずつ読み込んでいく方法があったなんて知らなかったから感謝。これでテキストファイルの処理が早くなります。

/**
* どどんとふチャットログ HTML ファイルからチャットログ部分を取り出して返す
* @param string $filename ファイル名
* @return string チャットログ部分を含む HTML コード
* @return NULL 読み込みに失敗した場合
*/
function read_dodontof_chat_log($filename) {
# ファイルポインタを取得する
$handle = fopen($filename, 'r');
if ($handle === FALSE) return NULL;

$html_code = '';

# 必要な部分が出現するまで読み飛ばす
$body_start = '/^s*<body>/';
while (($line = fgets($handle)) !== FALSE) {
if (preg_match($body_start, $line)) break;
}

# 必要な部分だけ読み込む
$body_end = '|^s*</body>|';
while (($line = fgets($handle)) !== FALSE) {
# 必要な部分の外に出たら脱出する
if (preg_match($body_end, $line)) break;

$html_code .= $line;
}

# ファイルを閉じる
fclose($handle);

return $html_code;
}

body内部を抜き出すのが分かっている場合、preg_matchではなくstrposを利用するとさらに早くなる。
PHP: fgets – Manual

fgetsはfopenなどで開かれたファイルではないと動作しないそうなので注意。