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 DataGrid 实现代码
Aug 12 PHP
php输出表格的实现代码(修正版)
Dec 29 PHP
PHP中数组定义的几种方法
Sep 01 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
PHP实现远程下载文件到本地
May 17 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
php实现学生管理系统
Mar 21 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
PHP大文件分片上传的实现方法
Oct 28 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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的CURD和查询方式介绍
2013/12/19 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
开源Web应用框架Django图文教程
2017/03/09 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
pandas通过索引进行排序的示例
2018/11/16 Python
Python数据可视化之画图
2019/01/15 Python
Django中间件基础用法详解
2019/07/18 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python多进程重复加载的解决方式
2019/12/13 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
养殖行业的创业计划书
2014/01/05 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
组织生活会发言材料
2014/12/15 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技