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框架的性能
Jan 10 PHP
php str_pad 函数使用详解
Jan 13 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
Session 失效的原因汇总及解决丢失办法
Sep 30 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 14 PHP
php的lavarel框架中join和orWhere的用法
Dec 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
php 破解防盗链图片函数
2008/12/09 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
python字符类型的一些方法小结
2016/05/16 Python
使用python生成目录树
2018/03/29 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
Python识别处理照片中的条形码
2020/11/16 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
大学生怎样进行自我评价
2013/12/07 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
爱心捐助倡议书
2014/05/19 职场文书
党员志愿者活动方案
2014/08/28 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
在Django中使用MQTT的方法
2021/05/10 Python