在早期的 PHP 开发中,采集第三方平台数据是常见需求。本文分享一段用于采集腾讯微博(现已停运)公开排行榜页面内容的 PHP 代码,展示如何通过正则表达式提取目标数据并清洗 HTML 标签。
<?php
header("Content-type:text/html;charset=utf-8");
// 获取腾讯微博排行榜页面源码
$weibo = file_get_contents('https://t.qq.com/starank');
// 正则匹配微博正文内容区块
$preg = '/<div class="msgCnt">(.*)<\/div><div class="mediaWrap">/Uis';
preg_match_all($preg, $weibo, $string);
// 遍历结果并清洗 HTML 标签
foreach ($string[1] as $key => $value) {
echo delhtml($value) . "<br/><br/><br/>";
}
/**
* 移除字符串中的 HTML 标签及特殊实体
* @param string $str 待处理字符串
* @return string 纯文本内容
*/
function delhtml($str) {
$st = -1; // 标签开始位置
$et = -1; // 标签结束位置
$stmp = array(" "); // 需移除的实体数组
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
$ss = substr($str, $i, 1);
// 检测到 '<' 记录开始位置
if (ord($ss) == 60) { // ord("<") == 60
$st = $i;
}
// 检测到 '>' 记录结束位置并截取标签
if (ord($ss) == 62) { // ord(">") == 62
$et = $i;
if ($st != -1) {
$stmp[] = substr($str, $st, $et - $st + 1);
}
}
}
// 批量替换移除标签与实体
return str_replace($stmp, "", $str);
}
?>
file_get_contents 直接抓取目标 URL 的 HTML 源码。preg_match_all 配合非贪婪模式(Uis 修饰符)精准定位微博正文所在的 <div class="msgCnt"> 区块。delhtml 函数通过 ASCII 码判断(< 为 60,> 为 62)遍历字符串,记录所有 HTML 标签位置并存入数组,最后用 str_replace 一次性清除,同时处理 等实体。⚠ 代码局限性:
file_get_contents 无法处理动态渲染、反爬验证码或需登录的页面。✅ 现代最佳实践:
robots.txt 与服务条款,控制采集频率。这段代码展示了早期 PHP 采集的基本思路:获取源码 → 正则提取 → 文本清洗。虽然简单直接,但在生产环境中建议采用更健壮的解析库与请求组件,并加入异常处理、重试机制及日志记录。