利用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;
}

使用方法与上面一致

相关内容

热门资讯

22年,一个免费软件的域名之战 奇怪的是,从 2004 年推出以来,Paint.NET一直托管在 getpaint.net网站上,无...
柬埔寨一名中国地产商人被残忍杀... 柬埔寨首都金边一名中国男子,疑遭人绑架、勒索并残忍杀害。其尸体于5月30日上午,在金边市朗哥区一处空...
2.5次元CNC加工厂家梳理 ... 导语:在精密制造领域,2.5次元CNC加工凭借其高精度检测与复杂零件加工能力,成为新能源汽车充电接口...
连云港灌南上演空中竞技,江苏省... 现代快报讯(通讯员 孙荪 刘青 记者 王晓宇)5月30日至31日,2026年江苏省城市无人机联赛暨灌...
火电厂装上“AI大脑” 来源:滚动播报 (来源:新华日报) □ 本报记者 倪 敏 5月26日下午3点,长江南岸,张家港。记者...
美防长夸赞中美关系却只字未提台... 【文/观察者网 熊超然】又是一年香格里拉对话会(简称“香会”),当地时间5月30日,在新加坡举行的第...
燃气灶打火有气怎么回事 燃气灶打火有气是指在打开燃气阀门的同时,打火器能够成功引燃燃气,但这种情况下还是需要进一步了解才能判...
清洗燃气灶灶头 首先倒一些洗洁精在台面上,然后用刷子刷洗台面。此举是将台面上大一点的污渍清洗干净。拆下灶头上的火架,...
燃气灶熄火保护装置怎么清洗 主要方法有,1、可以选择用小苏打水来进行清洗,用500毫升热水与30克小苏打混合,再用毛巾蘸水之后擦...
灶具自动熄火 1、一般的灶具都会有过压保护功能,所以说要查看是否是这个原因而引起。2、也有可能是和灶具点火针位置发...