利用PHP獲取一個頁面上的連結資訊

科技小能手發表於2017-11-12

開發中我們可能會獲取某個頁面或是一段內容中的連結資訊,下面我分享一個我寫的函式給大家,希望能幫到大家。


函式功能:

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



相關文章