php匹配指定标签的内容
2015-06-14 22:30
603 查看
php匹配指定div内容,在用php编写采集程序的时候,抓取到的网页数据有时候我们只需要一小段标签内容,怎么才能冲html代码中提取出来呢,这里提供一个函数示例,实现php匹配任意html标签内的所有内容:
$html=file_get_contents('http://www.baidu.com');
$divContent=getWebTag('id="content"','div',$html);
/** * 匹配任意id的html标签内容 * */ function getWebTag($tag_id,$tag='div',$data=false){ $charset_pos = stripos($data,'charset'); if($charset_pos) { if(stripos($data,'utf-8',$charset_pos)) { $data = iconv('utf-8','utf-8',$data); }else if(stripos($data,'gb2312',$charset_pos)) { $data = iconv('gb2312','utf-8',$data); }else if(stripos($data,'gbk',$charset_pos)) { $data = iconv('gbk','utf-8',$data); } } preg_match_all('/<'.$tag.'/i',$data,$pre_matches,PREG_OFFSET_CAPTURE); //获取所有div前缀 preg_match_all('/<\/'.$tag.'/i',$data,$suf_matches,PREG_OFFSET_CAPTURE); //获取所有div后缀 $hit = strpos($data,$tag_id); if($hit == -1) return false; //未命中 $divs = array(); //合并所有div foreach($pre_matches[0] as $index=>$pre_div){ $divs[(int)$pre_div[1]] = 'p'; $divs[(int)$suf_matches[0][$index][1]] = 's'; } //对div进行排序 $sort = array_keys($divs); asort($sort); $count = count($pre_matches[0]); foreach($pre_matches[0] as $index=>$pre_div){ //<div $hit <div+1 时div被命中 if(($pre_matches[0][$index][1] < $hit) && ($hit < $pre_matches[0][$index+1][1])){ $deeper = 0; //弹出被命中div前的div while(array_shift($sort) != $pre_matches[0][$index][1] && ($count--)) continue; //对剩余div进行匹配,若下一个为前缀,则向下一层,$deeper加1, //否则后退一层,$deeper减1,$deeper为0则命中匹配,计算div长度 foreach($sort as $key){ if($divs[$key] == 'p') $deeper++; else if($deeper == 0) { $length = $key-$pre_matches[0][$index][1]; break; }else { $deeper--; } } $hitDivString = substr($data,$pre_matches[0][$index][1],$length).'</'.$tag.'>'; break; } } return $hitDivString; }调用示例
$html=file_get_contents('http://www.baidu.com');
$divContent=getWebTag('id="content"','div',$html);
相关文章推荐
- THINKPHP3.2学习笔记(1)目录结构
- PHP定时执行的三种方式实现
- PHP笔试题
- ubuntu下buffalo wzr-hp-300nh路由器刷DD-WRT系统
- php面向对象Clone与序列化
- PHPExcel导出插入图片和居中问题
- PHP 错误与异常 笔记与总结(11 )register_shutdown_function() 函数的使用
- 最新php环境搭建
- PHP 错误与异常 笔记与总结(10)错误处理器测试
- php+MySQL图书管理系统(四)
- php web编程使用的工具总结
- PHP_EOL
- phpStudy + JspStudy 2014.10.02 下载
- ThinkPHP实现跨模块调用操作方法概述
- ThinkPHP整合百度Ueditor图文教程
- PHP获取今天、昨天、明天的日期
- PHP获取中英文混合字符串长度及截取
- 该如何关闭thinkphp的缓存呢?有下面几种方法可参考:
- ThinkPHP 3.2版本 , 无法读取$_SESSION[&#39;verify_code&#39;]
- ThinkPHP视图查询详解