利用PHP获取一个页面上的链接信息

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


函数功能:

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


上一篇:《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动


下一篇:让keras训练深度网络时使用多个显卡