この目的にはDOMを使用する方がよいことはわかっていますが、次の方法でテキストを抽出してみましょう。
<?php
$html=<<<EOD
<html>
<head>
</head>
<body>
<p>Some text</p>
</body>
</html>
EOD;
preg_match('/<body.*?>/', $html, $matches, PREG_OFFSET_CAPTURE);
if (empty($matches))
exit;
$matched_body_start_tag = $matches[0][0];
$index_of_body_start_tag = $matches[0][1];
$index_of_body_end_tag = strpos($html, '</body>');
$body = substr(
$html,
$index_of_body_start_tag + strlen($matched_body_start_tag),
$index_of_body_end_tag - $index_of_body_start_tag + strlen($matched_body_start_tag)
);
echo $body;
結果はここで見ることができます:http://ideone.com/vH2FZ
ご覧のとおり、予想よりも多くのテキストが表示されています。
substr($string, $start, $length)
関数の正しい長さを取得するために、私が理解していないことがあります。
$index_of_body_end_tag - $index_of_body_start_tag + strlen($matched_body_start_tag)
この式には何の問題もありません。
誰かが問題がどこにあるかを親切に提案できますか?
みなさん、ありがとうございました。
編集:
皆様、本当にありがとうございました。私の脳にはただのバグがあります。あなたの答えを読んだ後、私は今問題が何であるかを理解しました、それは次のいずれかでなければなりません:
$index_of_body_end_tag - ($index_of_body_start_tag + strlen($matched_body_start_tag));
または:
$index_of_body_end_tag - $index_of_body_start_tag - strlen($matched_body_start_tag);