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

发布时间:2020-07-23 19:20:17 作者:gutaotao1989
来源:网络 阅读:1015

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


函数功能:

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(?:.*?)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;
}

使用方法:

$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(?:.*?)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;
}

使用方法与上面一致

推荐阅读:
  1. php获取远程页面上的所有链接
  2. 利用asp.net怎么生成一个静态页并添加链接

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php 页面链接信息

上一篇:数据库系统原理与设计——投影运算、选择运算

下一篇:Nmap在pentest box中的扫描及应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》