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正则走开
Mar 15 PHP
php懒人函数 自动添加数据
Jun 28 PHP
PHP迭代器的内部执行过程详解
Nov 12 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
PHP var关键字相关原理及使用实例解析
Jul 11 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
ThinkPHP空模块和空操作详解
2014/06/30 PHP
php计算title标题相似比的方法
2015/07/29 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
Javascript 读后台cookie代码
2008/09/15 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
详解Python当中的字符串和编码
2015/04/25 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
Python接口测试结果集实现封装比较
2020/05/01 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
建筑设计所实习生自我鉴定
2013/09/25 职场文书
毕业生多媒体设计求职信
2013/10/12 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
师德承诺书
2015/01/20 职场文书
给医院的感谢信
2015/01/21 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs