利用PHP获取一个页面上的链接信息
admin
2023-07-03 08:24:59
0次

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


函数功能:

1、获取一段内容中链接信息;

2、获取一个URL中链接信息;

3、剔除锚链等无效的链接

4、获取当前域下的链接信息

5、获取他域下的链接信息

6、保留链接的文本信息

代码:

/**
 * +----------------------------------------------------------
 * 功能:获取一个网页或一段内容里面的链接信息
 * +----------------------------------------------------------
 * @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>/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;
}

使用方法:

$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、提取链接用了正则,效率可能低。


当然你也看一看使用下面的函数,当要提取的内容网址的时候不使用正则来提取链接信息:

代码:

/**
 * +----------------------------------------------------------
 * 功能:获取一个网页或一段内容里面的链接信息
 * +----------------------------------------------------------
 * @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>/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;
}

使用方法与上面一致

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...