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


相关文章
|
设计模式 PHP
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
php设计模式--观察者模式(4.1)面向过程完成页面内容切换
80 0
|
数据采集 存储 数据挖掘
超越常规:用PHP抓取招聘信息
使用PHP和爬虫代理IP,自动化采集51job网站的招聘信息,关注公司、职位和待遇,数据存储为CSV,提升招聘效率,节省资源。示例代码展示如何设置代理、解析HTML并提取所需信息。此方法有利于人才市场情报获取和企业招聘策略制定。注意实际应用需考虑错误处理和适应网站结构变化。
超越常规:用PHP抓取招聘信息
|
3月前
|
安全 搜索推荐 PHP
一款轻量级的PHP链接发布页面源码
一款轻量级的PHP链接发布页面源码
75 6
|
10月前
|
JavaScript 前端开发 安全
php学习笔记-普通表单参数提交获取及页面的重定向和一个登录小demo-day05
本文介绍了PHP中普通表单参数的提交获取、页面重定向的方法,并通过一个登录示例演示了表单参数的封装和页面跳转处理。
|
10月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
10月前
|
搜索推荐 PHP UED
PHP中的异常处理与自定义错误页面
【8月更文挑战第33天】在PHP开发中,优雅地处理异常和错误是提升应用稳定性和用户体验的关键。本文将引导你理解PHP的异常处理机制,并教你如何创建自定义错误页面,以增强你的应用对错误的响应能力。从基本的错误类型到深入的异常捕获,再到实现个性化的用户提示,我们将一步步构建一个更加健壮的PHP应用。
90 4
|
PHP
PHP地方门户分类信息网站源码讯客分类信息系统源码(含手机版)
1.上传程序到网站根目录,访问http://域名/install/index.php 进行安装,不要直接打开网址,先直接安装; 2.安装完成后 后台恢复数据即可 默认帐号密码都是admin http://域名/admin/ 3.不要删除任何文件,因为删除文件或者修改代码可能造成错误
628 0
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
328 2
|
XML JSON API
快速淘宝商品详情页面API接口传输 php
PI(Application Programming Interface,应用程序接口)是一组预定义的函数、协议和工具,用于构建软件应用程序之间的交互。它允许不同的软件系统和应用通过统一的接口进行数据交换和通信
|
关系型数据库 MySQL 测试技术