【发布时间】:2011-06-22 02:39:40
【问题描述】:
我知道为此目的最好使用 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);
【问题讨论】:
-
我看了你的评论,问题是你有换行,在计算字符时,\n(或\r\n)也被计算在内,所以你的偏移量不正确,这就是你的原因最后阅读更多文字。我会用更好的解释更新我的答案。
标签: php regex text text-processing html-content-extraction