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 相关文章推荐
Banner程序
Oct 09 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
php自动加载机制的深入分析
Jun 08 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
php统计数组元素个数的方法
Jul 02 PHP
PHP文件上传类实例详解
Apr 08 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 PHP
PHP文件后缀不强制为.php方法
Mar 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
laravel框架的安装与路由实例分析
2019/10/11 PHP
用js的for循环获取radio选中的值
2013/10/21 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
人机交互程序 python实现人机对话
2017/11/14 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
pytorch打印网络结构的实例
2019/08/19 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
Django admin组件的使用
2020/10/24 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
班风学风建设方案
2014/05/06 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python
Python实现视频自动打码的示例代码
2022/04/08 Python
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技