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