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.MVC的模板标签系统(五)
Sep 05 PHP
第十一节--重载
Nov 16 PHP
PHP伪静态页面函数附使用方法
Jun 20 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
php实现encode64编码类实例
Mar 24 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
Laravel框架表单验证操作实例分析
Sep 30 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
自己动手做一个SQL解释器
2006/10/09 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php购物车实现方法
2015/01/03 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
微信小程序wepy框架学习和使用心得详解
2019/05/24 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
js实现简单进度条效果
2020/03/25 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
2020/04/16 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python编程argparse入门浅析
2018/02/07 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
事业单位竞聘上岗实施方案
2014/03/28 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
节水标语大全
2014/06/11 职场文书
欢度春节标语
2014/07/01 职场文书
音乐幼师求职信
2014/07/09 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
毕业生入职感言
2015/07/31 职场文书
应届毕业生的自我评价
2019/06/21 职场文书