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 相关文章推荐
一个改进的UBB类
Oct 09 PHP
利用static实现表格的颜色隔行显示
Oct 09 PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
Jan 05 PHP
php数组冒泡排序算法实例
May 06 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
php支付宝系列之电脑网站支付
May 30 PHP
php 将json格式数据转换成数组的方法
Aug 21 PHP
PHP SESSION机制的理解与实例
Mar 22 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
php自定义时间转换函数示例
2016/12/07 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
python分割文件的常用方法
2014/11/01 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
Reformation官网:美国女装品牌
2018/09/14 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
优秀实习自我鉴定
2013/12/04 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
好的旅游活动方案
2014/08/19 职场文书
文体活动总结
2015/02/04 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
计算机实训心得体会
2016/01/14 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python