在PHP开发中,截取网页内容通常分为两个环节:先通过 file_get_contents、cURL 或第三方库采集目标页面,再利用 字符串函数、正则表达式 或 DOM解析 从HTML中前后截取所需片段。以下是三种主流实现方式

一、使用 substr 与 strpos 进行前后截取
适用于结构简单、规则明确的页面。先获取网页源码,再用 strpos 定位标记位置,用 substr 按偏移量截取:
<?php
$html = file_get_contents('https://example.com');
$start = '<title>';
$end = '</title>';
$s = strpos($html, $start);
$e = strpos($html, $end, $s);
$title = substr($html, $s + strlen($start), $e - $s - strlen($start));
为避免未找到标记时报错,建议封装为安全函数,在 strpos 返回 false 时提前返回空字符串。若页面编码为UTF-8且涉及中文,substr 可能截断中文字符,应改用 mb_substr 并指定编码。
二、使用 preg_match 正则截取
通过 preg_match 配合子模式捕获,可一次完成定位与提取,代码更简洁:
preg_match('/<title>(.*?)<\/title>/s', $html, $m);
$title = $m[1] ?? '';
其中修饰符 s 表示跨行匹配,适合截取多行内容。截取正文div时可写作 /<div id="content">(.*?)<\/div>/s。若前后标记是定界标识(如 <!--begin--> 与 <!--end-->),用 preg_match('/begin(.*?)end/s') 是最典型的"前后截取"写法。注意正则对嵌套标签无能为力,复杂结构应换用DOM解析。
三、使用 DOMDocument 与 XPath 精准提取
这是处理真实网页最专业稳健的方案,无需关心标签嵌套层级:
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$node = $xpath->query('//title')->item(0);
$title = $node ? trim($node->textContent) : '';
配合 XPath 表达式 可按id、class、标签路径任意截取,例如 //div[@id="article"] 提取正文,//meta[@name="description"]/@content 提取摘要。加载前用 mb_convert_encoding 转码,可避免GBK页面出现乱码;@符号用于抑制HTML5标签的解析警告。
工程建议:生产环境采集推荐 cURL(支持UA伪装、超时、重定向与HTTPS),而不是直接使用 file_get_contents;调整输出编码统一用 mb_internal_encoding('UTF-8');维护阶段的站点结构变动频繁,应将截取规则集中配置,便于随时调整前后截取标记或XPath语句。

查看详情

查看详情