php切割页面div内容的实现代码分享


Posted in PHP onJuly 31, 2012

亮点:
1、利用php也能实现对页面div的切割处理。这里的做法抛砖引玉,希望读者能够提供更加完美的解决方案。
2、切割处理方法已经封装成一个方法,可以直接引用。
3、顺便加上标签云的截取。//getWebDiv('id="taglist"','https://3water.com/tag/');

<?php 
header("Content-type: text/html; charset=utf-8"); 
function getWebDiv($div_id,$url=false,$data=false){ 
if($url !== false){ 
$data = file_get_contents( $url ); 
} 
$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('/<div/i',$data,$pre_matches,PREG_OFFSET_CAPTURE); //获取所有div前缀 
preg_match_all('/<\/div/i',$data,$suf_matches,PREG_OFFSET_CAPTURE); //获取所有div后缀 
$hit = strpos($data,$div_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).'</div>'; 
break; 
} 
} 
return $hitDivString; 
} 
echo getWebDiv('id="taglist"','https://3water.com/tag/'); 
//End_php

考虑到id符号问题,id="u"由用户自己填写。
声明:此段php只针对带 id div内容的读取。
完善:匹配任意可闭合带id标签
View Code 
<?php 
header("Content-type: text/html; charset=utf-8"); 
function getWebTag($tag_id,$url=false,$tag='div',$data=false){ 
if($url !== false){ 
$data = file_get_contents( $url ); 
} 
$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; 
} 
echo getWebTag('id="nav"','http://mail.163.com/html/mail_intro/','ul'); 
echo getWebTag('id="homeBanners"','http://mail.163.com/html/mail_intro/'); 
echo getWebTag('id="performance"','http://mail.163.com/html/mail_intro/','section'); 
//End_php

作者: Zjmainstay
PHP 相关文章推荐
用PHP和ACCESS写聊天室(六)
Oct 09 PHP
一些常用的php函数
Dec 06 PHP
用PHP控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
php smarty函数扩展
Mar 15 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
Nov 22 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
Jan 29 PHP
php按单词截取字符串的方法
Apr 07 PHP
PHP中foreach()用法汇总
Jul 02 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
在laravel5.2中实现点击用户头像更改头像的方法
Oct 14 PHP
php中数组首字符过滤功能代码
Jul 31 #PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 #PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 #PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 #PHP
php 调试利器debug_print_backtrace()
Jul 23 #PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 #PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 #PHP
You might like
MySQL数据源表结构图示
2008/06/05 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
Laravel 队列使用的实现
2019/01/08 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
Python中文编码那些事
2014/06/25 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
应届毕业生求职自荐书
2014/01/03 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
商标侵权律师函
2015/05/27 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL