原生态php抠出table表格数据,并转换成json格式

这里写图片描述

如上图所示,要扣除里面的表格数据,该怎么弄呢?思路是先把整个表格抠出来,然后按照tr进行分割,存到数组,然后一个个遍历进行正则匹配,最后输出结果转化为json格式,供前台调用!

<?php

class getHtmlChar {

	var $url;
	var $pattern_find;
	var $pattern_replace;
	var $timeout;

	/**
	 * @param url 需要抓取的url链接
	 * @param pattern_find 需要匹配的字段正则表达式
	 * @param pattern_replace 需要替换的字符正则表达式
	 * @param timeout 设置超时阻断程序执行,默认10秒,这个字段一般留空
	 */

	function __construct($url, $pattern_find, $pattern_replace, $timeout) {
		$this->url = $url;
		$this->pattern_find = $pattern_find;
		$this->pattern_replace = $pattern_replace;
		$this->timeout = 10;
	}

	// 获取网页源代码
	function getHtml() {
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $this->url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'); //模拟浏览器,防止被拦截
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
		$html = curl_exec($ch);
		// 匹配需要的大的字段,例如一段table,取出来之后再一行一行做匹配
		preg_match($this->pattern_find, $html, $match);

		//判断是否有传入替换的正则表达式,如果有就进行匹配替换,并返回替换后的字符串,如果没有,则直接返回匹配出来的大段,例如整个table表格
		// echo "<pre>";
		// print_r($match);
		// echo "</pre>";
		// exit;
		if (!empty($this->pattern_replace)) {
			return preg_replace($this->pattern_replace, '', $match[0]);
		} else {
			return $match[0];
		}
	}

	// 传入正则和需要处理的字符串,返回的是匹配到的数组
	function prgMatche($pre_all, $strs) {
		if (!is_string($strs)) {
			echo '传入的不是字符串!请检查!<br>';
			echo "<pre>";
			print_r($strs);
			echo "</pre>";
			exit;
		}
		preg_match_all($pre_all, $strs, $matches);
		return $matches;
	}

	// 获取表格表头
	function getTableJson() {
		// 获取一行一行tr
		$trs = $this->prgMatche('/<tr([\s\S]+?)<\/tr>/i', $this->getHtml());
		// 获取表头
		$ths = $this->prgMatche('/<th>([\s\S]+?)<\/th>/i', $trs[1][0]);
		// 获取行数,循环匹配的时候需要用到
		$num = sizeof($trs[1]);
		// echo $num;
		// 一行一行匹配表格数据
		for ($i = 1; $i < $num; $i++) {
			$tr = $this->prgMatche('/td>([\s\S]+?)<\/td>/i', $trs[1][$i]);
			$tds[] = $tr[1];
		}
		// 把表头和表数据存入json
		array_unshift($tds, $ths[1]);
		// 返回一个数组,0为json格式数据,1为数组格式数据
		return [json_encode($tds), $tds];
	}
}

// 以下是调用这个类的例子
$url = 'http://www.pm25.in/chaozhou';
$pattern_find = '/<table([\s\S]+?)<\/table>/i';
$pattern_replace = '/\s{2,}|\n|<br>| class="O3_8h_dn"/i';

$gtd = new getHtmlChar($url, $pattern_find, $pattern_replace, '');
$time_start = microtime(true);
echo "<pre>";
print_r($gtd->getTableJson());#这里拿到数据之后就可以插入数据库了
echo "</pre>";
$time_end = microtime(true);
printf("这段程序运行的时间为 %s 秒!", $time_end - $time_start);

?>

注释写的很清楚,有不明白的可以在下面发表评论!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SHUIPING_YANG

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值