gpt4 book ai didi

php - 使用 PHP 提取 HTML 文档的正文

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:54:00 26 4
gpt4 key购买 nike

我知道为此目的使用 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);

最佳答案

问题是您的字符串在 .在模式中只匹配单行,你需要添加/s 修饰符来制作 .匹配多行

这是我的解决方案,我更喜欢这种方式。

<?php

$html=<<<EOD
<html>
<head>
</head>
<body buu="grger" ga="Gag">
<p>Some text</p>
</body>
</html>
EOD;

// get anything between <body> and </body> where <body can="have_as many" attributes="as required">
if (preg_match('/(?:<body[^>]*>)(.*)<\/body>/isU', $html, $matches)) {
$body = $matches[1];
}
// outputing all matches for debugging purposes
var_dump($matches);
?>

编辑:我正在更新我的答案,以便更好地解释您的代码失败的原因。

你有这个字符串:

<html>
<head>
</head>
<body>
<p>Some text</p>
</body>
</html>

一切似乎都很好,但实际上每一行都有非打印字符(换行符)。您有 53 个可打印字符和 7 个不可打印字符(新行,\n == 2 个字符实际上是每个新行)。

当你到达这部分代码时:

$index_of_body_end_tag = strpos($html, '</body>');

您得到了 的正确位置(从位置 51 开始),但这计算了新行。

所以当你到达这行代码时:

$index_of_body_start_tag + strlen($matched_body_start_tag)

它评估为 31(包括新行),并且:

$index_of_body_end_tag - $index_of_body_start_tag + strlen($matched_body_start_tag)

它被评估为 51 - 25 + 6 = 32(你必须阅读的字符)但是你在 和 之间只有 16 个可打印的文本字符和 4 个不可打印的字符( 和 之前的新行)。这就是问题所在,您必须像这样对计算进行分组(确定优先级):

$index_of_body_end_tag - ($index_of_body_start_tag + strlen($matched_body_start_tag))

计算为 51 - (25 + 6) = 51 - 31 = 20 (16 + 4)。

:) 希望这可以帮助您理解为什么确定优先级很重要。 (很抱歉误导你关于换行符它只在我上面给出的正则表达式示例中有效)。

关于php - 使用 PHP 提取 HTML 文档的正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com