You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何抓取网页中两个指定HTML标签之间的内容

结论

你编写的preg_match代码无法实现需求,存在多处语法、逻辑错误,且正则匹配HTML的方案本身容错性极差,不适合这类场景。

原代码的具体错误
  • 参数类型错误:file()函数返回的是按行分割的数组,而preg_match要求第二个参数传入字符串类型的待匹配内容,直接传入数组会导致匹配失败
  • 正则语法错误:正则规则中多写了冗余的</符号,边界匹配逻辑错误
  • 语法结构错误:preg_match第三个参数应为接收完整匹配结果的数组,你传入$match[1]属于写法错误;且正则调用语句和后续输出的大括号没有绑定关系,语法逻辑不成立
  • 容错性极差:正则完全硬编码匹配标签的完整字符串,只要目标网站调整标签属性顺序、增减空格、修改style属性值的格式,就会直接匹配失败
  • 无异常处理:抓取失败、匹配失败时无兜底逻辑,会直接抛出错误或输出空内容
正确实现方案

不要用正则解析HTML,使用PHP内置的DOMDocument + XPath做节点定位,不依赖行号,只要标签的唯一标识(id)不变就能稳定匹配,不受中间代码变动、标签属性微调影响。
可直接运行的代码如下:

<?php
// 拉取完整网页内容,不拆分为行数组
$html = file_get_contents("https://the-url.com");
if (!$html) {
    exit("网页抓取失败");
}

// 屏蔽HTML不规范导致的解析警告
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML($html);
libxml_clear_errors();

$xpath = new DOMXPath($dom);
// 通过唯一id定位起止节点,不需要硬编码class、style等易变属性
$startNode = $xpath->query('//div[@id="result_list"]')->item(0);
$endNode = $xpath->query('//h3[@id="alternativen_text"]')->item(0);

if (!$startNode || !$endNode) {
    exit("未匹配到指定的起止标签");
}

$content = "";
// 先写入起始节点本身的内容
$content .= $dom->saveHTML($startNode);
$current = $startNode;
// 遍历起始节点后的所有同级节点,直到碰到结束节点为止
while ($current = $current->nextSibling) {
    if ($current === $endNode) {
        break;
    }
    $content .= $dom->saveHTML($current);
}

// 输出提取的内容
echo $content;
?>
方案说明
  • 不依赖固定行号,目标网站中间内容增删改完全不影响匹配结果
  • 以标签唯一id作为定位依据,不受标签属性顺序调整、多余空格、style/class属性修改影响
  • 兼容不规范的HTML代码,稳定性远高于正则匹配方案
  • 后续维护成本低,若标签变动仅需调整XPath定位规则即可

内容的提问来源于stack exchange,提问作者bruno2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 16:15:53