php匹配指定标签的内容

简介:

php匹配指定div内容,在用php编写采集程序的时候,抓取到的网页数据有时候我们只需要一小段标签内容,怎么才能冲html代码中提取出来呢,这里提供一个函数示例,实现php匹配任意html标签内的所有内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* 匹配任意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);



本文转自 gutaotao1989 51CTO博客,原文链接:http://blog.51cto.com/taoyouth/1661859

相关文章
|
8月前
|
前端开发 PHP
php后端接收富文本时过滤标签?
我们在写php后端接口时直接获取前端传过来的富文本数据时会过滤掉标签
69 0
|
8月前
|
PHP
PHP - Laravel 未转义输出,输出 HTML 标签到页面展示({!! $变量 !!})
PHP - Laravel 未转义输出,输出 HTML 标签到页面展示({!! $变量 !!})
119 0
|
9月前
|
PHP
php正则表达式函数preg_replace替换span标签
php正则表达式函数preg_replace替换span标签
43 0
php-获取txt文件内容并转换成数组
php-获取txt文件内容并转换成数组
88 0
php-获取txt文件内容并转换成数组
|
JavaScript PHP
phpQuery,php爬虫类库,像jQuery一样轻松采集内容
phpQuery,php爬虫类库,像jQuery一样轻松采集内容
177 0
|
PHP
php去除html标签,php strip_tags
php去除html标签,php strip_tags
71 0
|
JavaScript 前端开发 Java
JavaScript、PHP、Python、Java内容比较和地址比较
JavaScript、PHP、Python、Java内容比较和地址比较
JavaScript、PHP、Python、Java内容比较和地址比较
|
算法 测试技术 PHP
PHP将部分内容替换成星号
在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求。当时一开始是网上搜索了一下,看到有人是用substr_replace这个函数来替换的,后面我也用了这个函数,但在用的时候不是很好用。
PHP将部分内容替换成星号
|
PHP
如何把一行纯内容的rsa私钥,处理成php函数openssl_verify可以使用的格式
如何把一行纯内容的rsa私钥,处理成php函数openssl_verify可以使用的格式
243 0
如何把一行纯内容的rsa私钥,处理成php函数openssl_verify可以使用的格式