开发中我们可能会获取某个页面或是一段内容中的链接信息,下面我分享一个我写的函数给大家,希望能帮到大家。
函数功能:
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