php获取页面文字内容,利用PHP获取一个页面上的链接信息

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

函数功能:

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 = '/]*?)>([^/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 = '/]*?)>([^/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;

}

使用方法与上面一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值