PHP で html ファイルの<body>タグの中身を取得したかったんですが、以下のページに書いてあるような DOMDocument を使う方法だと、vue.js のような特殊な属性の記述方法をしている箇所でパースエラーが出てしまいダメでした。
結局、自前で文字列パースしてbodyタグ内の文字列を取得するようにしました。抜けはあるかもしれませんが、とりあえず私の用途だとそれで十分でした。誰かの役に立つかもしれないので、実装したコードを記載しておきます。
function extractBodyContent($html)
{
$bodyTag = "<body";
$beginTagPos = mb_strpos($html, $bodyTag);
if ($beginTagPos === false)
{
$bodyTag = "<BODY";
$beginTagPos = mb_strpos($html, $bodyTag);
if ($beginTagPos === false)
{
return false;
}
}
$tmpHtml = mb_substr($html, $beginTagPos);
$bodyEndPos = mb_strpos($tmpHtml, ">"); // bodyタグの終了
$contentBeginPos = $bodyEndPos + 1;
$tmpHtml = mb_substr($tmpHtml, $contentBeginPos);
$contentLength = mb_strpos($tmpHtml, "</body>");
if ($contentLength === false)
{
$contentLength = mb_strpos($tmpHtml, "</BODY>");
if ($contentLength === false)
{
// bodyの終了タグが見つからない
return false;
}
}
return mb_substr($tmpHtml, 0, $contentLength);
}
function getBodyFromHtmlFile($htmlFilePath)
{
$html = file_get_contents($htmlFilePath);
$result = extractBodyContent($html);
if ($result === false)
{
// bodyタグが見つからない場合はhtmlをそのまま返しておく
return $html;
}
return $result;
}