开发中我们可能会获取某个页面或是一段内容中的链接信息,下面我分享一个我写的函数给大家,希望能帮到大家。
函数功能:
1、获取一段内容中链接信息;
2、获取一个URL中链接信息;
3、剔除锚链等无效的链接
4、获取当前域下的链接信息
5、获取他域下的链接信息
6、保留链接的文本信息
代码:
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
|
/**
* +----------------------------------------------------------
* 功能:获取一个网页或一段内容里面的链接信息
* +----------------------------------------------------------
* @param string $html 要获取链接的内容或网址
* @param string $isExclude 是否过滤无效的链接,如"","#","javascript:;","javascript:void(0);" 。默认过滤
* @param string $isKeepLinkText 是否保留链接的文字。默认保留,保留与不保留链接数可能不同
* @param string $linkType 取得链接的类型,all所有的链接,inner 本域下的链接, out 外域的链接信息。默认 是取得所有链接
* +----------------------------------------------------------
* @return array
* +----------------------------------------------------------
*/
function
getLinks(
$html
,
$isExclude
=true,
$isKeepLinkText
=true,
$linkType
=
'all'
){
if
(
empty
(
$html
))
return
false;
set_time_limit(0);
//防止超时
$removes
=
array
(
''
,
'#'
,
'javascript:;'
,
'javascript:void(0);'
,
'javascript:void(0)'
);
//排除锚链之类的
$html
=
substr
(
strtolower
(
$html
),0,4)==
"http"
?
file_get_contents
(
$html
):
$html
;
//要处理的内容
//提取链接信息
$pattern
=
'/<a(?:.*?)href="(((?:http(?:s?):\/\/)?([^\"\/]+))?(?:[^\"]*))"(?:[^>]*?)>([^<]*?)<\/a>/i'
;
preg_match_all(
$pattern
,
$html
,
$_links
);
if
(
$isKeepLinkText
){
foreach
(
$_links
[1]
as
$key
=>
$href
) {
$links
[
$_links
[4][
$key
]]=
$href
;
}
}
else
{
$links
=
$_links
[4];
}
unset(
$_links
);
foreach
(
$links
as
$text
=>
$href
) {
//移除无效的链接
if
(
$isExclude
&&in_array(
$href
,
$removes
)) {
unset(
$links
[
$text
]);
}
if
(
$linkType
!=
'all'
){
$host
=
parse_url
(
$href
);
$host
=isset(
$host
[
'host'
])?
$host
[
'host'
]:
''
;
if
(
$linkType
==
'inner'
){
//本域链接
if
(
substr
(
$href
,0,1)!=
"/"
&&
strtolower
(
$host
)!=
strtolower
(
$_SERVER
[
'SERVER_NAME'
])) {
unset(
$links
[
$text
]);
}
}
elseif
(
$linkType
==
'out'
){
//他域链接
if
(
substr
(
$href
,0,1)==
"/"
||
strtolower
(
$host
)==
strtolower
(
$_SERVER
[
'SERVER_NAME'
])) {
unset(
$links
[
$text
]);
}
}
}
}
return
$links
;
}
|
使用方法:
1
2
3
4
5
6
7
|
$links
=getLinks(
"http://www.sina.com.cn"
);
//或
$links
=getLinks(
"http://www.sina.com.cn"
,1,0,
"out"
);
//或
$links
=getLinks(
"这里是一段要提取链接信息的内容"
);
|
特别说明:
1、上面的函数用到了file_get_contents ,获取内容可能会失败,你可以自行改成curl;
2、提取链接用了正则,效率可能低。
当然你也看一看使用下面的函数,当要提取的内容网址的时候不使用正则来提取链接信息:
代码:
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
55
56
57
58
59
60
61
62
63
64
|
/**
* +----------------------------------------------------------
* 功能:获取一个网页或一段内容里面的链接信息
* +----------------------------------------------------------
* @param string $html 要获取链接的内容或网址
* @param string $isExclude 是否过滤无效的链接,如"","#","javascript:;","javascript:void(0);" 。默认过滤
* @param string $isKeepLinkText 是否保留链接的文字。默认保留,保留与不保留链接数可能不同
* @param string $linkType 取得链接的类型,all所有的链接,inner 本域下的链接, out 外域的链接信息。默认 是取得所有链接
* +----------------------------------------------------------
* @return array
* +----------------------------------------------------------
*/
function
getLinks(
$html
,
$isExclude
=true,
$isKeepLinkText
=true,
$linkType
=
'all'
){
if
(
empty
(
$html
))
return
false;
set_time_limit(0);
$removes
=
array
(
''
,
'#'
,
'javascript:;'
,
'javascript:void(0);'
,
'javascript:void(0)'
);
//排除锚链之类的
$isLink
=
substr
(
strtolower
(
$html
),0,4)==
"http"
?1:0;
//是否是链接
$html
=
$isLink
?
file_get_contents
(
$html
):
$html
;
if
(
$isLink
){
$dom
=
new
DOMDocument();
@
$dom
->loadHTML(
$html
);
$xpath
=
new
DOMXPath(
$dom
);
unset(
$dom
);
$hrefs
=
$xpath
->evaluate(
"/html/body//a"
);//获取a节点
$length
=
$hrefs
->length;
//获取链接数
$links
=
array
();
//网页上的链接
for
(
$i
= 0;
$i
<
$length
;
$i
++) {
$href
= trim(
$hrefs
->item(
$i
)->getAttribute(
'href'
));
$text
=trim(
$hrefs
->item(
$i
)->textContent);
$links
[
$text
]=
$href
;
}
}
else
{
$pattern
=
'/<a(?:.*?)href="(((?:http(?:s?):\/\/)?([^\"\/]+))?(?:[^\"]*))"(?:[^>]*?)>([^<]*?)<\/a>/i'
;
preg_match_all(
$pattern
,
$html
,
$_links
);
if
(
$isKeepLinkText
){
foreach
(
$_links
[2]
as
$key
=>
$href
) {
$links
[
$_links
[4][
$key
]]=
$href
;
}
}
else
{
$links
=
$_links
[4];
}
unset(
$_links
);
}
foreach
(
$links
as
$text
=>
$href
) {
//移除无效的链接
if
(
$isExclude
&&in_array(
$href
,
$removes
)) {
unset(
$links
[
$text
]);
}
if
(
$linkType
!=
'all'
){
$host
=
parse_url
(
$href
);
$host
=isset(
$host
[
'host'
])?
$host
[
'host'
]:
''
;
if
(
$linkType
==
'inner'
){
//本域链接
if
(
substr
(
$href
,0,1)!=
"/"
&&
strtolower
(
$host
)!=
strtolower
(
$_SERVER
[
'SERVER_NAME'
])) {
unset(
$links
[
$text
]);
}
}
elseif
(
$linkType
==
'out'
){
//他域链接
if
(
substr
(
$href
,0,1)==
"/"
||
strtolower
(
$host
)==
strtolower
(
$_SERVER
[
'SERVER_NAME'
])) {
unset(
$links
[
$text
]);
}
}
}
}
return
$links
;
}
|
使用方法与上面一致
本文转自 gutaotao1989 51CTO博客,原文链接:http://blog.51cto.com/taoyouth/1410393