PHP文章采集URL补全函数(FormatUrl)

 更新时间:2012年08月02日 22:46:27   作者:  
写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 相对路径 或者 绝对根路径 不是 绝对全路径 就无法收集URL
写采集必用的函数,URL补全函数,也可叫做FormatUrl。
写此函数作用就是为了开发采集程序,采集文章的时候会经常遇到页面里的路径是 “相对路径” 或者 “绝对根路径” 不是“绝对全路径”就无法收集URL。

所以,就需要本功能函数进行对代码进行格式化,把所有的超链接都格式化一遍,这样就可以直接收集到正确的URL了。

路径知识普及
相对路径:“../” “./” 或者前面什么都不加
绝对根路径:/path/xxx.html
绝对全路径:http://www.xxx.com/path/xxx.html
使用实例:
复制代码 代码如下:

<?php
$surl="https://www.jb51.net/";
$gethtm = '<a href="/index.htm">首页</a><a href="Resolvent/index.htm">解决方案</a>';
echo formaturl($gethtm,$surl);
?>

输出:<a href="https://www.jb51.net/index.htm">首页</a><a href="https://www.jb51.net/Resolvent/index.htm">解决方案</a>
--------- 演示实例 ------------
原始路径代码:http://www.newnew.cn/newnewindex.aspx
输出演示代码:http://www.maifp.com/aaa/test.php
以下是函数代码
复制代码 代码如下:

<?php
function formaturl($l1,$l2){
if (preg_match_all("/(<img[^>]+src=\"([^\"]+)\"[^>]*>)|(<a[^>]+href=\"([^\"]+)\"[^>]*>)|(<img[^>]+src='([^']+)'[^>]*>)|(<a[^>]+href='([^']+)'[^>]*>)/i",$l1,$regs)){
foreach($regs[0] as $num => $url){
$l1 = str_replace($url,lIIIIl($url,$l2),$l1);
}
}
return $l1;
}
function lIIIIl($l1,$l2){
if(preg_match("/(.*)(href|src)\=(.+?)( |\/\>|\>).*/i",$l1,$regs)){$I2 = $regs[3];}
if(strlen($I2)>0){
$I1 = str_replace(chr(34),"",$I2);
$I1 = str_replace(chr(39),"",$I1);
}else{return $l1;}
$url_parsed = parse_url($l2);
$scheme = $url_parsed["scheme"];if($scheme!=""){$scheme = $scheme."://";}
$host = $url_parsed["host"];
$l3 = $scheme.$host;
if(strlen($l3)==0){return $l1;}
$path = dirname($url_parsed["path"]);if($path[0]=="\\"){$path="";}
$pos = strpos($I1,"#");
if($pos>0) $I1 = substr($I1,0,$pos);
//判断类型
if(preg_match("/^(http|https|ftp):(\/\/|\\\\)(([\w\/\\\+\-~`@:%])+\.)+([\w\/\\\.\=\?\+\-~`@\':!%#]|(&amp;)|&)+/i",$I1)){return $l1; }//http开头的url类型要跳过
elseif($I1[0]=="/"){$I1 = $l3.$I1;}//绝对路径
elseif(substr($I1,0,3)=="../"){//相对路径
while(substr($I1,0,3)=="../"){
$I1 = substr($I1,strlen($I1)-(strlen($I1)-3),strlen($I1)-3);
if(strlen($path)>0){
$path = dirname($path);
}
}
$I1 = $l3.$path."/".$I1;
}
elseif(substr($I1,0,2)=="./"){
$I1 = $l3.$path.substr($I1,strlen($I1)-(strlen($I1)-1),strlen($I1)-1);
}
elseif(strtolower(substr($I1,0,7))=="mailto:"||strtolower(substr($I1,0,11))=="javascript:"){
return $l1;
}else{
$I1 = $l3.$path."/".$I1;
}
return str_replace($I2,"\"$I1\"",$l1);
}
?>

下面的链接是学习PHP正则表达式的地方。在这里留个链接,防止丢失。。。

相关文章

  • PHP中ajax无刷新上传图片与图片下载功能

    PHP中ajax无刷新上传图片与图片下载功能

    本文给大家分享php ajax无刷新上传图片与图片下载功能的实现代码,非常不错,具有参考借鉴价值,需要的的朋友参考下
    2017-02-02
  • thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法

    thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is

    这篇文章主要介绍了thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法,涉及thinkPHP针对php7关键字判定的相关底层代码修改技巧,需要的朋友可以参考下
    2016-09-09
  • PHP Streams(流)详细介绍及使用

    PHP Streams(流)详细介绍及使用

    这篇文章主要介绍了PHP Streams(流)详细介绍及使用,PHP Streams是内置核心操作,可能一般的开发者很少用,它用于统一文件、网络、数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口,需要的朋友可以参考下
    2015-05-05
  • PHP获取音频文件的相关信息

    PHP获取音频文件的相关信息

    这篇文章主要介绍了PHP获取音频文件的相关信息的相关资料,非常的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • Yii2中SqlDataProvider用法示例

    Yii2中SqlDataProvider用法示例

    这篇文章主要介绍了Yii2中SqlDataProvider用法,结合实例形式分析了Yii2框架中使用SqlDataProvider类操作数据库的相关技巧,需要的朋友可以参考下
    2016-09-09
  • 掌握Laravel框架中容器的管理依赖实现松耦合

    掌握Laravel框架中容器的管理依赖实现松耦合

    这篇文章主要为大家介绍了掌握Laravel框架中容器管理依赖实现松耦合,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • laravel邮件发送的实现代码示例

    laravel邮件发送的实现代码示例

    这篇文章主要介绍了laravel邮件发送的实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • PHP 二维关联数组根据其中一个字段排序(推荐)

    PHP 二维关联数组根据其中一个字段排序(推荐)

    这篇文章主要介绍了PHP 二维关联数组根据其中一个字段排序的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-04-04
  • php格式化时间戳

    php格式化时间戳

    一般mysql数据库中存储时间都是使用的Unix时间戳,那么我们显示时间的时候如果更加的友好呢,今天就给大家分享3个封装好的格式化函数,有需要的小伙伴可以参考下
    2016-12-12
  • 使用PHP连接数据库_实现用户数据的增删改查的整体操作示例

    使用PHP连接数据库_实现用户数据的增删改查的整体操作示例

    下面小编就为大家带来一篇使用PHP连接数据库_实现用户数据的增删改查的整体操作示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论