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


Posted in PHP onAugust 02, 2012

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

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

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

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

输出:<a href="https://3water.com/index.htm">首页</a><a href="https://3water.com/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\/\\\.\=\?\+\-~`@\':!%#]|(&)|&)+/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 相关文章推荐
用PHP实现小型站点广告管理(修正版)
Oct 09 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
解读PHP中上传文件的处理问题
May 29 PHP
php封装的验证码类分享
Feb 26 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
微信开发之获取JSAPI TICKET
Jul 07 PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
php实现分页功能的详细实例方法
Sep 29 PHP
php+ajax实现文件切割上传功能示例
Mar 03 PHP
详解thinkphp的Auth类认证
May 28 PHP
PHP服务器页面间跳转实现方法
Aug 02 #PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 #PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
Aug 01 #PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
Jul 31 #PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
Jul 31 #PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 #PHP
php切割页面div内容的实现代码分享
Jul 31 #PHP
You might like
PHP 图像尺寸调整代码
2010/05/26 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
javascript各种复制代码收集
2008/09/20 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
node实现登录图片验证码的示例代码
2018/04/20 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
JS实现分页导航效果
2020/02/19 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
对python数据切割归并算法的实例讲解
2018/12/12 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
校园网站的创业计划书范文
2013/12/30 职场文书
中层竞聘演讲稿
2014/01/09 职场文书
项目总经理岗位职责
2014/02/14 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
小学生操行评语大全
2014/04/22 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
法学求职信
2014/06/22 职场文书
历史博物馆观后感
2015/06/05 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
Python访问Redis的详细操作
2021/06/26 Python